2009-12-15 17 views
5

Sto provando il Simple XML serializer. Sono più interessato alla deserializzazione da XML-> Java. Qui è il mio codice come una prova di unità:Deserializzazione XML semplice

import java.io.StringReader; 
import java.io.StringWriter; 

import junit.framework.TestCase; 

import org.simpleframework.xml.Attribute; 
import org.simpleframework.xml.Root; 
import org.simpleframework.xml.Serializer; 
import org.simpleframework.xml.core.Persister; 

public class SimpleTest extends TestCase { 
    public void testWriting() throws Exception { 
     StringWriter writer = new StringWriter(); 
     Address address = new Address("1234 Main Street", "San Francisco", "CA"); 
     Serializer serializer = new Persister(); 

     serializer.write(address, writer); 
     System.out.println("Wrote: " + writer.getBuffer()); 
    } 

    public void testReading() throws Exception { 
     String input = "<address street='1234 Main Street' city='San Francisco' state='CA'/>"; 
     Serializer serializer = new Persister(); 
     System.out.println("Read back: " + serializer.read(Address.class, new StringReader(input))); 
    } 
} 

@Root 
class Address { 
    @Attribute(name="street") 
    private final String street; 

    @Attribute(name="city") 
    private final String city; 

    @Attribute(name="state") 
    private final String state; 

    public Address(@Attribute(name="street") String street, @Attribute(name="city") String city, @Attribute(name="state") String state) { 
     super(); 
     this.street = street; 
     this.city = city; 
     this.state = state; 
    } 

    @Override 
    public String toString() { 
     return "Address [city=" + city + ", state=" + state + ", street=" + street + "]"; 
    } 
} 

questo funziona, ma i ripetuti @Attribute annotazioni (al campo ed in argomento del costruttore) nella classe Indirizzo sembrare brutto. C'è un modo per:

  • avere un semplice nome del nome di attributo dal nome del campo?
  • si può semplicemente ignorare la serializzazione, in modo che io possa farla franca annotando i campi o l'argomento del costruttore?
+3

Se si sta cercando la deserializzazione XML-> Java semplice e non sono legati a un particolare pacchetto, ecco un'alternativa: http://sourceforge.net/projects/practicalxml/ (notare che non l'ho inserito come risposta perché sembri molto felice, che non è un buon modo per trattare le persone che stanno cercando di aiutarti) – kdgregory

+0

@kdgregory Grazie, non sono legato a un particolare pacchetto - controllerò praticoxml. Si prega di non prendere i downvotes troppo personalmente - i suggerimenti offerti sono stati da nessuna parte vicino a risolvere il mio problema ed erano rumorosi, IMO. –

+1

@kdgregory A pensarci bene, ero troppo contento. Scuse a tutti. –

risposta

1

Non penso che sia necessario l'attributo di tutte le ripetizioni e le annotazioni extra. Se il nome è uguale all'attributo dell'oggetto, verrà utilizzato per impostazione predefinita.

così puoi semplicemente dichiararlo come:

@Root 
class Address { 
    @Attribute 
    private final String street; 

    @Attribute 
    private final String city; 

    @Attribute 
    private final String state; 

    public Address(String street, String city, String state) { 
     super(); 
     this.street = street; 
     this.city = city; 
     this.state = state; 
    } 

    @Override 
    public String toString() { 
     return "Address [city=" + city + ", state=" + state + ", street=" + street + "]"; 
    } 
} 
+0

No, non funziona, almeno in Simple 2.1.3. –

+0

Il mio male, non ho prestato più attenzione che vorresti avere un indirizzo immutabile. In base alla semplice corrente, è necessario avere la duplicazione del tag @Attribute, poiché ha utilizzato l'annotazione sull'attributo per la serializzazione e il costruttore per la deserializzazione. Puoi andare via senza nome tag sull'attributo ma non sui parametri del costruttore, dal momento che il compilatore ne tiene traccia solo per ordine invece che per nome. –

+0

Dipende dall'obiettivo che stai cercando di raggiungere. Ovviamente è possibile rendere la classe mutabile e applicare manualmente l'immutabilità nel setter. Ma poi di nuovo, il codice diventerà brutto. Tra i due, potrei andare con l'opzione doppia annotazione. –

0

Java serializzare tutti i membri della classe di default se attuano Serializable e rispettare la sintassi JavaBean.

+0

Penso che tu abbia frainteso la domanda. Voglio un deserializzatore XML-> Java. –

+0

La serializzazione Java funziona in entrambi i modi. Se serializzi gli oggetti Java in XML utilizzando la serializzazione Java, puoi anche deserializzarli da oggetti XML a oggetti Java. Il processo è trasparente e flessibile.In una applicazione uso la serializzazione/deserializzazione XML di Java per scrivere alberi oggetto su disco e leggerli di nuovo su richiesta dell'utente - stiamo parlando di centinaia di migliaia di file - e funziona bene, secondo me. Controlla http://java.sys-con.com/node/37550 per esempi: le classi chiave sono 'XMLEncoder' e' XMLDecoder'. – spork

0

Ho avuto preoccupazioni simili ma con strutture di oggetti piuttosto complicate. L'ho risolto usando la libreria JAXB per il marshaling e il de-marshaling, che è piuttosto comune. Puoi anche considerare di separare completamente la logica di marshalling dalla tua classe java usando gli aspetti - puoi trattare tutte le annotazioni in un aspetto separato che renderà la tua classe java completamente pulita dalle annotazioni di marshalling.

Problemi correlati