¿Cuál es el análogo de Java de la serialización XML de .NET?
¿Cuál es el análogo de Java de la serialización XML de .NET?
Respuestas:
Respuesta de 2008 La API de Java "oficial" para esto ahora es JAXB - API de Java para enlaces XML. Consulte el tutorial de Oracle . La implementación de referencia se encuentra en http://jaxb.java.net/
Actualización de 2018 Tenga en cuenta que los módulos Java EE y CORBA están obsoletos en SE en JDK9 y se eliminarán de SE en JDK11 . Por lo tanto, para usar JAXB, deberá estar en su entorno de clase empresarial existente incluido en su servidor de aplicaciones, por ejemplo, o deberá traerlo manualmente.
XStream es bastante bueno para serializar objetos a XML sin mucha configuración y dinero. (está bajo licencia BSD).
Lo usamos en uno de nuestros proyectos para reemplazar la antigua serialización de Java y funcionó casi de inmediato.
Es posible que desee ver el proyecto de serialización XML simple . Es lo más parecido que he encontrado a System.Xml.Serialization en .Net.
JAXB es parte de la versión 1.6+ de la edición estándar de JDK. Así es FREE
y no hay bibliotecas adicionales para descargar y administrar. Puede encontrar un ejemplo simple aquí
XStream parece estar muerto. La última actualización fue el 6 de diciembre de 2008.
Simple
Parece tan fácil y simple como JAXB pero no pude encontrar ninguna información de licencia para evaluarlo para uso empresarial.
Cabe mencionar que desde la versión 1.4, Java tenía las clases java.beans.XMLEncoder y java.beans.XMLDecoder. Estas clases realizan codificación XML, que es al menos muy comparable a la serialización XML y, en algunas circunstancias, puede funcionar por usted.
Si su clase se apega a la especificación JavaBeans para sus captadores y definidores, este método es sencillo de usar y no necesita un esquema. Con las siguientes advertencias:
Por ejemplo, tome la siguiente declaración:
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;}
}
Ejecutando 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();
Resultaría en el siguiente archivo:
<?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
con datos proporcionados por el usuario puede introducir vulnerabilidades de ejecución de código arbitrario en su código.
XMLBeans funciona muy bien si tiene un esquema para su XML. Crea objetos Java para el esquema y crea métodos de análisis fáciles de usar.
Si está hablando de la serialización XML automática de objetos, consulte Castor :
Castor es un marco de enlace de datos de código abierto para Java [tm]. Es la ruta más corta entre objetos Java, documentos XML y tablas relacionales. Castor proporciona enlace de Java a XML, persistencia de Java a SQL y más.
Por lo general, uso jaxb o XMLBeans si necesito crear objetos serializables a XML. Ahora, puedo ver que XStream podría ser muy útil ya que no es intrusivo y tiene una API realmente simple. Jugaré con él pronto y probablemente lo usaré. El único inconveniente que noté es que no puedo crear la identificación del objeto por mi cuenta para referencias cruzadas.
@Barak Schiller ¡
Gracias por publicar el enlace a XStream!
si desea una solución estructurada (como ORM), JAXB2 es una buena solución.
Si desea una serialización como DOT NET, puede usar la persistencia a largo plazo de los componentes de JavaBeans
La elección depende del uso de la serialización.
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;
}