java xml-serialization simple-framework

java - Serialización de clases de terceros con XML simple(org.simpleframework.xml)



xml-serialization simple-framework (3)

Creo que tengo la respuesta a esto.

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

Debe registrar el convertidor y resolver el problema.

Decidí usar la serialización XML simple y tuve problemas básicos. Estoy intentando serializar la instancia de la clase java.util.UUID como campo final en esta clase pequeña:

@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 convertidores como este:

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

El 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 simple código simplemente no funcionó para mí, durante la serialización de objetos con campos UUID se lanzó la excepción Transformación de clase java.utilIDID no compatible .

He intentado algo similar con Matcher personalizado (que no estaba en el tutorial) que me funciona:

Serializer serializer = new Persister(new MyMatcher()); serializer.write( object, stream );

y la clase Matcher tiene este 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:

  • ¿El Matcher personalizado siempre es una práctica recomendada para transmitir clases de terceros?
  • ¿En qué caso puedo usar Converter?
  • ¿Hay mejores tutoriales / ejemplos para XML simple por ahí?

Gracias.


Sé que esto es un poco viejo pero mi oportunidad llegué a la misma excepción.

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

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


Tengo que responder por mi cuenta otra vez :-)

Consejo de Niall Gallagher, líder de proyecto de XML simple, de la lista de soporte:

"Se podría usar un Convertidor o una Transformación. Yo diría que para un UUID, una Transformación con un Matcher sería la opción más fácil".

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