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.
¿Intentó usar la anotación Convertir y la Estrategia de anotación con su convertidor? ¿Eso funcionó? – Mark
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
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