Na própria documentação do Xstream tem um exemplo no qual você pode definir a ordem dos campos:
SortableFieldKeySorter sorter = new SortableFieldKeySorter();
sorter.registerFieldOrder(MyType.class, new String[] { "firstToSerialize", "secondToSerialize", "thirdToSerialize" });
xstream = new XStream(new Sun14ReflectionProvider(new FieldDictionary(sorter)));
Mas pelo jeito está desatualizada, já que a classe Sun14ReflectionProvider
está deprecated desde a versão 1.4.7 - a partir desta versão ela deve ser trocada por SunUnsafeReflectionProvider
. Lembrando de fazer o import com.thoughtworks.xstream.converters.reflection.*
para carregar estas classes.
Segue um exemplo que fiz. Primeiro criei essa classe:
import java.time.LocalDate;
public class Pessoa {
private String nome;
private LocalDate dataNascimento;
private String endereco;
public Pessoa(String nome, LocalDate dataNascimento, String endereco) {
this.nome = nome;
this.dataNascimento = dataNascimento;
this.endereco = endereco;
}
// getters/setters, etc...
}
Primeiro sem definir ordenação:
import com.thoughtworks.xstream.XStream;
import java.time.LocalDate;
public class Whatever {
public static void main(String[] args) {
Pessoa p = new Pessoa("fulano de tal", LocalDate.of(1970, 1, 10), "Rua tal 42");
XStream x = new XStream();
x.alias("pessoa", Pessoa.class);
System.out.println(x.toXML(p));
}
}
Saída:
<pessoa>
<nome>fulano de tal</nome>
<dataNascimento>1970-01-10</dataNascimento>
<endereco>Rua tal 42</endereco>
</pessoa>
Depois adicionei a ordenação dos campos:
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.converters.reflection.FieldDictionary;
import com.thoughtworks.xstream.converters.reflection.SortableFieldKeySorter;
import com.thoughtworks.xstream.converters.reflection.SunUnsafeReflectionProvider;
import java.time.LocalDate;
public class Whatever {
public static void main(String[] args) {
Pessoa p = new Pessoa("fulano de tal", LocalDate.of(1970, 1, 10), "Rua tal 42");
SortableFieldKeySorter sorter = new SortableFieldKeySorter();
sorter.registerFieldOrder(Pessoa.class, new String[]{"dataNascimento", "endereco", "nome"});
XStream x = new XStream(new SunUnsafeReflectionProvider(new FieldDictionary(sorter)));
x.alias("pessoa", Pessoa.class);
System.out.println(x.toXML(p));
}
}
E agora ficou assim:
<pessoa>
<dataNascimento>1970-01-10</dataNascimento>
<endereco>Rua tal 42</endereco>
<nome>fulano de tal</nome>
</pessoa>