Qual é o análogo Java da serialização XML do .NET?
Qual é o análogo Java da serialização XML do .NET?
Respostas:
Resposta de 2008 A API Java "oficial" para isso agora é JAXB - Java API para XML Binding. Veja o Tutorial da Oracle . A implementação de referência está 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 empacotado por seu servidor de aplicativo, por exemplo, ou você precisará trazê-lo manualmente.
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 de java e funcionou quase fora da caixa.
Você pode querer dar uma olhada no projeto Simple XML Serialization . É a coisa mais próxima que encontrei do System.Xml.Serialization em .Net.
JAXB faz parte da edição padrão JDK versão 1.6+. Assim é FREE
e sem 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 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 possuía 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 fazer o truque para você.
Se sua classe seguir a especificação JavaBeans para seus getters e setters, esse método é direto de usar e você não precisa de um esquema. Com as seguintes ressalvas:
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>
java.beans.XMLDecoder
dados fornecidos pelo usuário pode introduzir vulnerabilidades de execução de código arbitrário em seu código.
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, verifique o Castor :
Castor é uma estrutura de vinculação de dados de código aberto para Java [tm]. É o caminho mais curto entre objetos Java, documentos XML e tabelas relacionais. O Castor fornece vinculação Java para XML, persistência de Java para SQL e muito mais.
Normalmente, eu uso jaxb ou XMLBeans se preciso criar objetos serializáveis para XML. Agora, posso ver que o XStream pode ser muito útil, pois não é intrusivo e tem uma API muito simples. Vou brincar com ele em breve e provavelmente usá-lo. A única desvantagem que percebi é que não consigo criar o id do objeto sozinho para referência cruzada.
@Barak Schiller
Obrigado por postar link para o XStream!
se você deseja uma solução estruturada (como ORM), o JAXB2 é uma boa solução.
Se você deseja uma serialização como DOT NET, então você pode usar Long Term Persistence of JavaBeans Components
A escolha depende do uso de 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;
}