Pregunta

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

¿Fue útil?

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top