Serialización XML en Java? [cerrado]

104

¿Cuál es el análogo de Java de la serialización XML de .NET?

Dmitry Shechtman
fuente
6
Ah, los gloriosos viejos tiempos en los que las preguntas de una sola línea como ésta eran bienvenidas en SO. Tan útil. Sin todo ese "¿Qué has probado?" / "Proporciona detalles", tonterías que a la gente le gusta leer hoy.
GOTO 0

Respuestas:

81

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.

Cheekysoft
fuente
2
¡Así es, JAXB es definitivamente la mejor opción!
ivan_ivanovich_ivanoff
1
JAXB se eliminó de las distribuciones estándar de Java a partir de Java 10, lo que la convierte ahora en una biblioteca que debe empaquetar con su aplicación si lo desea, a menos que esté operando en un contexto que ya la empaqueta para usted.
Theodore Murdock
69

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.

Barak Schiller
fuente
3
Sin embargo, muy útil, puede tener problemas en estructuras de árbol completadas como JGraph con objetos de nodo que no son cadenas.
mikek3332002
Más simple y mejor que otras soluciones
daitangio
Me gusta XStream. Lo único es que no entiendo por qué se agrega un carácter antes del XML real.
James P.
17

Proyecto de "serialización XML simple"

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.

ARKBAN
fuente
Sin embargo, requiere anotaciones de mapeo para cada campo.
mP.
1
No es cierto, no lo necesito. Puede cambiar el comportamiento predeterminado y usará solo los campos presentes.
Damluar
1
También apoyo de todo corazón a "Simple" . Lo he usado en un par de proyectos con gran éxito. "Simple" es mucho más simple que JAXB. Más apropiado cuando tiene necesidades relativamente simples: tiene objetos que deben escribirse en el almacenamiento para luego rehidratarlos como objetos nuevamente. JAXB tiene muchas más funciones y flexibilidad, pero es un tipo de cosas "80/20", la mayoría de las veces en la mayoría de los proyectos es posible que solo necesite el subconjunto simple de funciones.
Basil Bourque
Funciona bien si solo desea un mapeo 1: 1. Si sus clases evolucionan y aún necesita deserializar XML antiguo, se encontrará con problemas porque tanto la documentación como los mensajes de error son algo vagos. Por lo general, es posible diagnosticar el problema, pero averiguar cómo solucionarlo puede llevar varios días.
toolforger
13

JAXB es parte de la versión 1.6+ de la edición estándar de JDK. Así es FREEy 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. SimpleParece tan fácil y simple como JAXB pero no pude encontrar ninguna información de licencia para evaluarlo para uso empresarial.

so_mv
fuente
4
XStream no está muerto, solo es maduro y estable, lo que significa que no hay mucho que agregar a la funcionalidad principal. Lo mismo es cierto para la implementación de referencia JAXB, sin mucha actividad durante los últimos años.
StaxMan
9

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:

  • Como con la serialización normal de Java
    • la codificación y decodificación se ejecutan en InputStream y OutputStream
    • el proceso utiliza los métodos writeObject y readObject familiares
  • En contraste con 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 solo 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>
Mishax
fuente
Tenga en cuenta que el uso java.beans.XMLDecodercon datos proporcionados por el usuario puede introducir vulnerabilidades de ejecución de código arbitrario en su código.
aventurin
2

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.

John Meagher
fuente
0

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.

Theo
fuente
0

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!

Bartosz Bierkowski
fuente
El problema es que jaxb y xmlbeans requieren un esquema de mapeo y no son automáticos ...
mP.
-1
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;
}
usuario4067649
fuente
Muchos problemas: Reinvención de la clase # getSimpleName *** Reinvención de PropertyDescriptor *** Se asume que todas las propiedades son campos accesibles *** No almacena en caché los resultados de reflexión (lento) *** No hay forma de personalizar nada (por ejemplo, necesitaría reemplazar nombres de clases y archivos) *** Sin deserialización
toolforger