2009-12-15 23 views
5

Estoy probando el Simple XML serializer. Estoy más interesado en la deserialización de XML-> Java. Aquí está mi código como una prueba de unidad:Deserialización de XML simple

import java.io.StringReader; 
import java.io.StringWriter; 

import junit.framework.TestCase; 

import org.simpleframework.xml.Attribute; 
import org.simpleframework.xml.Root; 
import org.simpleframework.xml.Serializer; 
import org.simpleframework.xml.core.Persister; 

public class SimpleTest extends TestCase { 
    public void testWriting() throws Exception { 
     StringWriter writer = new StringWriter(); 
     Address address = new Address("1234 Main Street", "San Francisco", "CA"); 
     Serializer serializer = new Persister(); 

     serializer.write(address, writer); 
     System.out.println("Wrote: " + writer.getBuffer()); 
    } 

    public void testReading() throws Exception { 
     String input = "<address street='1234 Main Street' city='San Francisco' state='CA'/>"; 
     Serializer serializer = new Persister(); 
     System.out.println("Read back: " + serializer.read(Address.class, new StringReader(input))); 
    } 
} 

@Root 
class Address { 
    @Attribute(name="street") 
    private final String street; 

    @Attribute(name="city") 
    private final String city; 

    @Attribute(name="state") 
    private final String state; 

    public Address(@Attribute(name="street") String street, @Attribute(name="city") String city, @Attribute(name="state") String state) { 
     super(); 
     this.street = street; 
     this.city = city; 
     this.state = state; 
    } 

    @Override 
    public String toString() { 
     return "Address [city=" + city + ", state=" + state + ", street=" + street + "]"; 
    } 
} 

Esto funciona, pero los repetidos @Attribute anotaciones (en el terreno y en el argumento del constructor) en la clase de dirección se ven feos. ¿Hay alguna forma de:

  • ¿Tiene simple averiguar el nombre del atributo del nombre del campo?
  • tienen una serialización simple de ignorar, de modo que puedo salirme anotando los campos o el argumento del constructor?
+3

Si está buscando una deserialización sencilla de XML-> Java y no está vinculada a un paquete en particular, aquí hay una alternativa: http://sourceforge.net/projects/practicalxml/ (tenga en cuenta que no puse esto como respuesta porque parece muy despreocupado, lo cual no es una buena manera de tratar a las personas que intentan ayudarlo) – kdgregory

+0

@kdgregory Gracias, no estoy vinculado a un paquete en particular. Veré practicalxml. Por favor, no tomen los votos abajo demasiado personalmente, las sugerencias ofrecidas no estaban ni cerca de resolver mi problema y eran ruidosas, OMI. –

+1

@kdgregory Pensándolo bien, yo también estaba muy feliz. Disculpas a todos –

Respuesta

1

No creo que necesite toda esa repetición y el atributo de las anotaciones adicionales. Si el nombre es el mismo que el atributo del objeto, se usará de manera predeterminada.

lo que sólo puede declararse como:

@Root 
class Address { 
    @Attribute 
    private final String street; 

    @Attribute 
    private final String city; 

    @Attribute 
    private final String state; 

    public Address(String street, String city, String state) { 
     super(); 
     this.street = street; 
     this.city = city; 
     this.state = state; 
    } 

    @Override 
    public String toString() { 
     return "Address [city=" + city + ", state=" + state + ", street=" + street + "]"; 
    } 
} 
+0

No, eso no funciona, al menos en Simple 2.1.3. –

+0

Malo, no presté mucha atención a que quisiera tener una dirección inmutable. Basado en el simple actual, necesitarás tener una duplicación de la etiqueta @Attribute, ya que usó la anotación en el atributo para la serialización y el constructor para la deserialización. Puede escaparse sin la etiqueta de nombre en el atributo, pero no en los parámetros del constructor, ya que el compilador solo realiza un seguimiento del mismo por orden en lugar de por nombre. –

+0

Depende de qué objetivo intente lograr. Por supuesto, puede hacer que la clase sea mutable e imponer la inmutabilidad manualmente en el setter. Pero, de nuevo, el código se pondrá feo. Entre los dos, podría ir con la opción de doble anotación. –

0

Java serializará todos los miembros de la clase por defecto si implementan Serializable y se adhieren a la sintaxis JavaBean.

+0

Creo que malinterpretaste la pregunta. Quiero un deserializador XML-> Java. –

+0

La serialización de Java funciona en ambos sentidos. Si serializa sus objetos Java a XML utilizando la serialización de Java, también puede deserializarlos de objetos XML a Java. El proceso es transparente y flexible.En una aplicación utilizo la serialización/deserialización XML de Java para escribir árboles de objetos en el disco y volver a leerlos a petición del usuario, estamos hablando de cientos de miles de archivos, y funciona bien, en mi opinión. Consulte http://java.sys-con.com/node/37550 para ver ejemplos: las clases de teclas son 'XMLEncoder' y' XMLDecoder'. – spork

0

Tenía una preocupación similar pero con estructuras de objetos bastante complicadas. Lo resolví mediante el uso de la biblioteca JAXB para la clasificación y eliminación de referencias, que es bastante común. También puede considerar separar por completo la lógica de cálculo de referencias de su clase java mediante el uso de aspectos: puede tratar todas las anotaciones en un aspecto separado lo que hará que su clase java esté completamente limpia de las anotaciones de referencias.

Cuestiones relacionadas