2010-09-02 11 views
17

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.

+0

Hai provato a utilizzare l'annotazione Converti e AnnotationStrategy con il convertitore? Ha funzionato? – Mark

+0

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

+3

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

risposta

16

devo rispondere da solo di nuovo :-)

Consigli da Niall Gallagher, responsabile del progetto di XML semplice, dal sostegno-list:

", è possibile utilizzare un convertitore o di una trasformazione Direi per un UUID una trasformazione con un Matcher sarebbe l'opzione più semplice. "

Quindi, io uso Transform<T>/Matcher e soddisfatto con esso. Questo non cambia il fatto che il Converter<T> non funziona per me :-)

+0

Domanda molto utile e (auto) risposta :-)! Mi ha aiutato sulla mia applicazione! –

+4

Questo era molto più utile della "documentazione" per Simple XML. –

1

Penso di avere la risposta a questo.

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

dovrebbe registrare il convertitore e risolvere il problema.

0

So che questo è un po 'vecchio ma la mia possibilità mi ha fatto la stessa eccezione.

Il problema reale è l'uso dell'annotazione @Attribute. Se invece di @Attribute si mette @Element l'eccezione non appare e il convertitore viene utilizzato per la serializzazione.

Suppongo che dipenderà quindi dall'annotazione utilizzata che è necessario creare un convertitore o utilizzare la soluzione Marker-Transform. Anche se non so se questo è il comportamento intenzionale.

Problemi correlati