Serialização XML em Java?

Qual é o análogo de Java da serialização XML do .NET?

Resposta 2008 A API Java “Oficial” é agora JAXB – Java API for XML Binding. Veja o tutorial do Oracle . A implementação de referência está em http://jaxb.java.net/

Atualização 2018 Observe que os Módulos Java EE e CORBA estão reprovados no SE no JDK9 e devem ser removidos do SE no JDK11 . Portanto, para usar o JAXB, ele precisará estar em seu ambiente de class empresarial existente, incluído no seu servidor de aplicativos, ou você precisará trazê-lo manualmente.

XStream é muito bom em serializar objects para XML sem muita configuração e dinheiro! (está sob licença BSD).

Usamos em um de nossos projetos para replace a tradicional serialização java e funcionou quase que imediatamente.

Projeto “Simple XML Serialization”

Você pode querer olhar para o projeto Simple XML Serialization . É a coisa mais próxima que eu encontrei para o System.Xml.Serialization no .net.

O JAXB faz parte da versão 1.6 + da edição padrão do JDK. Portanto, é FREE e não há bibliotecas extras para baixar e gerenciar. Um exemplo simples pode ser encontrado aqui

XStream parece estar morto. A última atualização foi em 6 de dezembro de 2008. Simple parece tão fácil e mais simples quanto o JAXB, mas não consegui encontrar nenhuma informação de licenciamento para avaliá-la para uso corporativo.

Vale mencionar que, desde a versão 1.4, o Java tinha as classs java.beans.XMLEncoder e java.beans.XMLDecoder. Essas classs executam a codificação XML, que é pelo menos muito comparável à serialização XML e, em algumas circunstâncias, pode ser útil para você.

Se sua class adere à especificação JavaBeans para seus getters e setters, esse método é simples de usar e você não precisa de um esquema. Com as seguintes ressalvas:

  • Como na serialização normal de Java
    • codificação e decodificação rodam sobre um InputStream e OutputStream
    • o processo usa os methods writeObject e readObject familar
  • Em contraste com a serialização Java normal
    • a codificação, mas também a decodificação, faz com que construtores e inicializadores sejam invocados
    • codificação e decodificação funcionam independentemente se sua class implementa serializável ou não
    • modificadores transitórios não são levados em conta
    • funciona apenas para classs públicas, que têm construtores públicos

Por exemplo, tome a seguinte declaração:

 public class NPair { public NPair() { } int number1 = 0; int number2 = 0; public void setNumber1(int value) { number1 = value;} public int getNumber1() { return number1; } public void setNumber2(int value) { number2 = value; } public int getNumber2() {return number2;} } 

Executando este código:

 NPair fe = new NPair(); fe.setNumber1(12); fe.setNumber2(13); FileOutputStream fos1 = new FileOutputStream("d:\\ser.xml"); java.beans.XMLEncoder xe1 = new java.beans.XMLEncoder(fos1); xe1.writeObject(fe); xe1.close(); 

Resultaria no seguinte arquivo:

     12   13    

O XMLBeans funciona muito bem se você tiver um esquema para o seu XML. Ele cria objects Java para o esquema e cria methods de análise fáceis de usar.

Se você está falando sobre a serialização automática de XML de objects, confira Castor :

Castor é uma estrutura de binding de dados de código aberto para Java [tm]. É o caminho mais curto entre objects Java, documentos XML e tabelas relacionais. O Castor fornece binding Java-para-XML, persistência de Java para SQL e muito mais.

Normalmente eu uso jaxb ou XMLBeans se eu precisar criar objects serializáveis ​​para XML. Agora, eu posso ver que o XStream pode ser muito útil, pois não é intrusivo e tem uma API realmente simples. Eu vou brincar com isso em breve e provavelmente usá-lo. A única desvantagem que notei é que não consigo criar o ID do object sozinho para referência cruzada.

@Barak Schiller
Obrigado por postar link para XStream!

Não se esqueça do JiBX .

Se você quer uma solução estruturada (como ORM), então JAXB2 é uma boa solução.

Se você quiser uma serialização como DOT NET, então você pode usar Persistência de Longo Prazo dos Componentes JavaBeans

A escolha depende do uso de serialização.

 public static String genXmlTag(String tagName, String innerXml, String properties ) { return String.format("<%s %s>%s", tagName, properties, innerXml, tagName); } public static String genXmlTag(String tagName, String innerXml ) { return genXmlTag(tagName, innerXml, ""); } public static  String serializeXML(List list) { String result = ""; if (list.size() > 0) { T tmp = list.get(0); String clsName = tmp.getClass().getName(); String[] splitCls = clsName.split("\\."); clsName = splitCls[splitCls.length - 1]; Field[] fields = tmp.getClass().getFields(); for (T t : list) { String row = ""; try { for (Field f : fields) { Object value = f.get(t); row += genXmlTag(f.getName(), value == null ? "" : value.toString()); } } catch (IllegalAccessException e) { e.printStackTrace(); } row = genXmlTag(clsName, row); result += row; } } result = genXmlTag("root", result); return result; }