Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Formatação XML em deserialização

Bom dia!

Não consegui entender o porquê tivemos que formatar o XML com alias, aliasField e useAttributeFor na deserialização visto que o código de origem já apresenta as características desejadas como nome da classe, descrição e codigo.

Código da dúvida:

String xmlDeOrigem = "<compra>\n"+
                "  <id>15</id>\n"+
                "  <produtos>\n"+
                "    <produto codigo=\"1587\">\n"+
                "      <nome>geladeira</nome>\n"+
                "      <preco>1000.0</preco>\n"+
                "      <descrição>geladeira duas portas</descrição>\n"+
                "    </produto>\n"+
                "    <produto codigo=\"1588\">\n"+
                "      <nome>ferro de passar</nome>\n"+
                "      <preco>100.0</preco>\n"+
                "      <descrição>ferro com vaporizador</descrição>\n"+
                "    </produto>\n"+
                "  </produtos>\n"+
                "</compra>";

        XStream xstream = new XStream();
        xstream.alias("compra", Compra.class);
        xstream.alias("produto", Produto.class);
        xstream.aliasField("descrição", Produto.class, "descricao");
        xstream.useAttributeFor(Produto.class, "codigo");

Obrigado!

2 respostas
solução!

Oi Cesar, tudo bem ?

Cara toda vez que vamos deserializar um xml temos que ensinar o XStream a fazer isso, pois por trás dos panos ele usará Reflection, eu não se você conhece esse assunto, contudo acredito que seja a coisa mais poderosa que o java tem, vamos entender porque, esse xml será deserializado em tempo de execução, ou seja enquanto estiver rodando, vou dar uma breve explicação, como ele recebe uma String, ele terá que percorrer la, nisso falamos para ele o seguinte, toda vez que você encontrar a tag compra gostaria que você criasse um objeto do tipo Compra, para isso a gente usa o método alias, passando a tag e o tipo do objeto.

Na mesma lógica nós usamos o método aliasFieldpara falar que ele vai encontrar no xml a tag descrição e ao fazer isso ele vai ter que substituir pelo atributo descricao da classe Produto.

E por último, o uso do método useAttributeFor que fala que na tag produto haverá um atributo que deve ser utilizado na criação do objeto.

Espero ter deixado um pouco mais claro.

Abraços

Olá Matheus, obrigado pela resposta!

Agora compreendo a necessidade dos métodos mencionados, serve para informar que a String se comportará como objeto ou atributo.