2010-09-02 4 views
17

He decidido utilizar Simple XML serialization y me topamos con un problema básico. Estoy tratando de serializar java.util.UUID instancia de clase como campo final en esta pequeña clase:Serialización de clases de terceros con Simple XML (org.simpleframework.xml)

@Root 
public class Identity { 
    @Attribute 
    private final UUID id; 

    public Identity(@Attribute UUID id) { 
     this.id = id; 
    } 
} 

Tutorial muestra cómo serializar objetos de terceros mediante el registro de los convertidores de esta manera:

Registry registry = new Registry(); 
registry.bind(UUID.class, UUIDConverter.class); 
Strategy strategy = new RegistryStrategy(registry); 
Serializer serializer = new Persister(strategy); 

serializer.write(object, stream); 

convertidor apropiado para UUID es bastante simple:

public class UUIDConverter implements Converter<UUID> { 
    @Override 
    public UUID read(InputNode node) throws Exception { 
     return new UUID.fromString(node.getValue()); 
    } 
    @Override 
    public void write(OutputNode node, UUID value) throws Exception { 
     node.setValue(value.toString()); 
    } 
} 

Pero este código simple simplemente no funcionó para mí, durante los objetos de serialización con campos UUID Se lanzó la excepción La transformación de la clase java.util estadounidenseID no es compatible con.

que han intentado algo algo similar con la costumbre Matcher (que no estaba en el tutorial) que funciona para mí:

Serializer serializer = new Persister(new MyMatcher()); 

serializer.write(object, stream); 

y Matcher clase tiene el siguiente aspecto:

public static class MyMatcher implements Matcher { 
    @Override 
    @SuppressWarnings("unchecked") 
    public Transform match(Class type) throws Exception { 
     if (type.equals(UUID.class)) 
      return new UUIDTransform(); 
     return null; 
    } 
} 

public class UUIDTransform implements Transform<UUID> { 
    @Override 
    public UUID read(String value) throws Exception { 
     return UUID.fromString(value); 
    } 
    @Override 
    public String write(UUID value) throws Exception { 
     return value.toString(); 
    } 
} 

Preguntas:

  • Es práctica siempre recomendada de Matcher para la transmisión de th ¿clases ird party?
  • ¿En qué caso puedo usar el convertidor?
  • ¿Hay mejores tutoriales/ejemplos para Simple XML?

Gracias.

+0

¿Intentó usar la anotación Convertir y la Estrategia de anotación con su convertidor? ¿Eso funcionó? – Mark

+0

Muy misma excepción con AnnotationStrategy. Clase similar con el campo 'java.net.URL' en lugar de UUID se serializa bien con convertidor personalizado. Existe soporte integrado para la serialización de la clase URL dentro de Simple XML por la clase URLTransform. – mschayna

+3

Parece que Convertir es solo para personalizar la serialización de clases ya admitidas, para clases desconocidas para Simple (por ejemplo 'java.utilmuneID') es necesario crear la clase Transform adecuada y usarla con Matcher personalizado. – mschayna

Respuesta

16

tengo que responder por mí mismo otra vez :-)

El consejo de Niall Gallagher, jefe de proyecto de Simple XML, de soporte para listas:

"Se podría utilizar un convertidor o un archivo de transformación Diría para un UUID, una Transformación con un Matcher sería la opción más fácil ".

Por lo tanto, yo uso Transform<T>/Matcher y estoy satisfecho con ello. Esto no altera el hecho de que el Converter<T> no funciona para mí :-)

+0

Pregunta muy útil y (auto) respuesta :-)! ¡Me ayudó en mi solicitud! –

+4

Esto fue mucho más útil que la "documentación" para Simple XML. –

1

Creo que tengo la respuesta a esto.

Strategy strategy = new AnnotationStrategy(); 
Serializer serializer = new Persister(strategy); 

debe registrar el convertidor y resolver el problema.

0

Sé que esto es un poco viejo pero tuve la oportunidad de llegar a la misma excepción.

El problema real es el uso de la anotación @Attribute. Si en lugar de @Attribute pone @Element, la excepción no aparece y el convertidor se usa para la serialización.

Supongo que dependerá de la anotación que haya utilizado para crear un convertidor o usar la solución Marker-Transform. Aunque no sé si este es el comportamiento intendente.