¿Serialización XML en Java?[cerrado]
-
09-06-2019 - |
Pregunta
¿Cuál es el análogo Java de la serialización XML de .NET?
Solución
Respuesta de 2008La API de Java "oficial" para esto ahora es JAXB: API de Java para enlace XML.Ver Tutorial de Oracle.La implementación de referencia vive en http://jaxb.java.net/
Actualización 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 utilizar JAXB, deberá estar en su entorno de clase empresarial existente incluido en su, p.servidor de aplicaciones, o deberás introducirlo manualmente.
Otros consejos
XStream ¡Es bastante bueno serializando 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 desde el primer momento.
Proyecto "Serialización XML simple"
Quizás quieras mirar el Serialización XML simple proyecto.Es lo más parecido que he encontrado a System.Xml.Serialization en .Net.
JAXB es parte de la edición estándar JDK versión 1.6+.Así es FREE
y no hay bibliotecas adicionales para descargar y administrar.Se puede encontrar un ejemplo sencillo. aquí
XStream parece estar muerto.La última actualización fue el 6 de diciembre de 2008.Simple
Parece tan fácil y sencillo 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 contaba con 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 ser la solución.
Si su clase se ciñe 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:
- Como ocurre con la serialización normal de Java.
- codificación y decodificación ejecutadas sobre un InputStream y OutputStream
- el proceso utiliza los métodos familiares writeObject y readObject
- A diferencia de la serialización normal de Java
- la codificación pero también la decodificación hace que se invoquen constructores e inicializadores
- La codificación y decodificación funcionan independientemente de si su clase implementa Serializable o no.
- Los modificadores transitorios no se tienen en cuenta.
- funciona sólo para clases públicas, que tienen constructores públicos
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>
Frijoles XML Funciona muy bien si tienes un esquema para tu XML.Crea objetos Java para el esquema y crea métodos de análisis fáciles de usar.
Si está hablando de 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 el camino más corto entre objetos Java, documentos XML y tablas relacionales.Castor proporciona enlace de Java a XML, persistencia de Java a SQL y más.
Normalmente uso jaxb o Frijoles XML si necesito crear objetos serializables a XML.Ahora puedo ver eso XStream podría ser muy útil ya que no es intrusivo y tiene una API realmente simple.Jugaré con él pronto y probablemente lo use.El único inconveniente que noté es que no puedo crear la identificación del objeto por mi cuenta para realizar referencias cruzadas.
@Barak Schiller
¡Gracias por publicar el enlace a XStream!
no lo olvides JiBX.
si quieres un solución estructurada (como ORM), entonces JAXB2 es una buena solución.
Si desea una serialización como DOT NET, entonces puede usar Persistencia a largo plazo de los componentes 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;
}