Ordernar Objeto com Xstream?

Boa tarde, meu problema é o seguinte hehe

Eu tenho um objeto, e serializo ele com o xstream, o problema é que o objeto perde toda a ordenação, e eu precisaria dele na mesma ordem que foi montado o objeto.

Existe algum modo de fazer isso??

Obrigado.

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>