Pergunta

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

Foi útil?

Solução

Resposta de 2008A API Java "oficial" para isso agora é JAXB - Java API for XML Binding.Ver Tutorial da Oracle.A implementação de referência reside em http://jaxb.java.net/

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

Outras dicas

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

Nós o usamos em um de nossos projetos para substituir a velha serialização java e funcionou quase imediatamente.

Projeto "Serialização XML Simples"

Você pode querer dar uma olhada no Serialização XML Simples projeto.É a coisa mais próxima que encontrei do System.Xml.Serialization em .Net.

JAXB faz parte da edição padrão do JDK versão 1.6+.Então é FREE e nenhuma biblioteca extra 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 simples quanto JAXB, mas não consegui encontrar nenhuma informação de licenciamento para avaliá-lo para uso empresarial.

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

Se sua classe seguir a especificação JavaBeans para seus getters e setters, esse método será simples de usar e você não precisará de um esquema.Com as seguintes advertências:

  • Tal como acontece com a serialização Java normal
    • codificação e decodificação executadas em InputStream e OutputStream
    • o processo usa os métodos writeObject e readObject familiares
  • 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 de sua classe implementar Serializable ou não
    • modificadores transitórios não são levados em consideração
    • funciona apenas para classes públicas, que possuem 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:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_02" class="java.beans.XMLDecoder">
 <object class="NPair">
  <void property="number1">
   <int>12</int>
  </void>
  <void property="number2">
   <int>13</int>
  </void>
 </object>
</java>

XMLBeans funciona muito bem se você tiver um esquema para seu XML.Ele cria objetos Java para o esquema e métodos de análise fáceis de usar.

Se você está falando sobre serialização XML automática de objetos, confira rícino:

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

Geralmente eu uso jaxb ou XMLBeans se eu precisar criar objetos serializáveis ​​para XML.Agora, eu posso ver isso XStream pode ser muito útil, pois não é intrusivo e possui uma API muito simples.Vou brincar com ele em breve e provavelmente usarei.A única desvantagem que notei é que não consigo criar o ID do objeto sozinho para referência cruzada.

@Barak Schiller
Obrigado por postar o link para XStream!

Não se esqueça JiBX.

se você quiser um solução estruturada (como ORM), então JAXB2 é uma boa solução.

Se você deseja uma serialização como DOT NET, você pode usar Persistência de longo prazo de componentes JavaBeans

A escolha depende do uso da serialização.

public static String genXmlTag(String tagName, String innerXml, String properties )
{
    return String.format("<%s %s>%s</%s>", tagName, properties, innerXml, tagName);
}

public static String genXmlTag(String tagName, String innerXml )
{
    return genXmlTag(tagName, innerXml, "");
}

public static <T> String serializeXML(List<T> 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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top