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í :-)