Ho deciso di utilizzare Simple XML serialization ed è stato stucked con il problema di base. Sto cercando di serializzare java.util.UUID
istanza di classe come campo finale in questa piccola classe:Classi di serializzazione di terze parti con XML semplice (org.simpleframework.xml)
@Root
public class Identity {
@Attribute
private final UUID id;
public Identity(@Attribute UUID id) {
this.id = id;
}
}
Tutorial mostra come serializzare gli oggetti di terze parti registrando convertitori in questo modo:
Registry registry = new Registry();
registry.bind(UUID.class, UUIDConverter.class);
Strategy strategy = new RegistryStrategy(registry);
Serializer serializer = new Persister(strategy);
serializer.write(object, stream);
convertitore appropriato per UUID è piuttosto semplice:
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());
}
}
Ma questo semplice codice semplicemente non ha funzionato per me, durante la serializzazione di oggetti con i campi UUID è stata generata l'eccezione Trasformazione della classe java.util.UUID non supportata.
ho cercato qualcosa di qualcosa di simile con personalizzato Matcher
(che non era in tutorial) che funziona per me:
Serializer serializer = new Persister(new MyMatcher());
serializer.write(object, stream);
e Matcher
classe assomiglia a questo:
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();
}
}
Domande:
- Il Matcher personalizzato consiglia sempre la pratica per lo streaming th classi di festa?
- In tal caso, posso utilizzare il convertitore?
- Esistono tutorial/esempi migliori per Simple XML?
Grazie.
Hai provato a utilizzare l'annotazione Converti e AnnotationStrategy con il convertitore? Ha funzionato? – Mark
La stessa eccezione con AnnotationStrategy. Una classe simile con il campo 'java.net.URL' invece di UUID è serializzata ok con un convertitore personalizzato. È disponibile il supporto integrato per la serializzazione della classe URL all'interno di Simple XML dalla classe URLTransform. – mschayna
Sembra che Convert sia solo per la personalizzazione della serializzazione di classi già supportate, per classi sconosciute per semplice (ad esempio 'java.util.UUID') è necessario creare la classe Transform appropriata e utilizzarla con il Matcher personalizzato. –
mschayna