2009-12-15 13 views
5

Ich probiere die Simple XML serializer aus. Ich interessiere mich mehr für die Deserialisierung von XML-> Java. Hier ist mein Code als Einheit Test:Einfache XML-Deserialisierung

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 + "]"; 
    } 
} 

Dies funktioniert, aber die wiederholten @Attribute Annotationen (auf dem Feld und im Konstruktorargument) in der Adressklasse hässlich aussehen. Gibt es einen Weg zu:

  • haben Sie einfach herauszufinden, den Attributnamen aus dem Feldnamen?
  • haben einfach ignorieren Serialisierung, so dass ich kommen kommentieren entweder die Felder oder das Konstruktorargument?
+3

Wenn Sie nach einfacher XML-> Java-Deserialisierung suchen und nicht an ein bestimmtes Paket gebunden sind, hier ist eine Alternative: http://sourceforge.net/projects/practicalxml/ (Beachten Sie, dass ich dies nicht gestellt habe als eine Antwort, weil Sie sehr glücklich scheinen downvote, das ist kein guter Weg, um die Leute zu behandeln, die versuchen, Ihnen zu helfen) – kdgregory

+0

@ kdgregory Danke, ich bin nicht an ein bestimmtes Paket gebunden - ich werde practicalxml überprüfen. Bitte nehmen Sie die Downvotes nicht zu persönlich - die angebotenen Vorschläge konnten mein Problem nicht lösen und waren laut, IMO. –

+1

@kdgregory Auf den zweiten Gedanken war ich zu glücklich. Entschuldigung an alle. –

Antwort

1

Ich glaube nicht, dass Sie all diese Wiederholung und das Attribut der zusätzlichen Anmerkungen benötigen. Wenn der Name dem Objektattribut entspricht, wird er standardmäßig verwendet.

so können Sie nur erklären ihn als:

@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

Nein, das geht nicht, zumindest in Simple 2.1.3. –

+0

Meine schlechte, ich habe nicht näher darauf geachtet, dass Sie eine unveränderliche Adresse haben möchten. Basierend auf den aktuellen einfachen müssen Sie die @Attribute-Tag duplizieren, da es die Annotation auf Attribut für Serialisierung und den Konstruktor für Deserialisierung verwendet. Sie können ohne Namensschild am Attribut, aber nicht an Konstruktorparametern auskommen, da der Compiler nur nach der Reihenfolge und nicht nach dem Namen den Namen verfolgt. –

+0

Verlassen Sie sich darauf, welches Ziel Sie erreichen möchten. Natürlich können Sie die Klasse änderbar machen und die Unveränderlichkeit im Setter manuell erzwingen. Aber dann wird der Code hässlich. Zwischen den beiden könnte ich einfach mit der Option für doppelte Anmerkungen gehen. –

0

Java werden alle Ihre Klasse standardmäßig Mitglieder serialisiert werden, wenn sie Serializable implementieren und an die JavaBean Syntax einzuhalten.

+0

Ich denke, du hast die Frage missverstanden. Ich möchte einen XML-> Java Deserializer. –

+0

Java-Serialisierung funktioniert in beide Richtungen. Wenn Sie Ihre Java-Objekte mithilfe der Java-Serialisierung in XML serialisieren, können Sie sie auch von XML in Java-Objekte deserialisieren. Der Prozess ist transparent und flexibel.In einer Anwendung benutze ich die XML-Serialisierung/Deserialisierung von Java, um Objektbäume auf Festplatte zu schreiben und sie auf Wunsch des Benutzers zurückzulesen - wir sprechen Hunderttausende von Dateien - und es funktioniert meiner Meinung nach gut. Beispiele finden Sie unter http://java.sys-con.com/node/37550 - die Schlüsselklassen sind 'XMLEncoder' und' XMLDecoder'. – spork

0

Ich hatte ähnliche Bedenken, aber mit ziemlich komplizierten Objekten Strukturen. Ich löste es mit JAXB-Bibliothek für Marshalling und De-Marshalling, die eine ziemlich häufige ist. Sie können auch die Marshalling-Logik vollständig von Ihrer Java-Klasse trennen, indem Sie Aspekte verwenden. Sie können alle Anmerkungen in einem separaten Aspekt behandeln, was Ihre Java-Klasse durch Marshalling-Anmerkungen vollständig sauber macht.