2009-02-26 4 views
2

Hallo Ich habe eine Java-Enumeration und ich möchte eine Variable serialisieren, die einen Enum-Wert aus XML für Persistenz enthält. Meine Enum ist wie folgt definiert ...Was ist die beste Vorgehensweise zum Serialisieren von Java-Enums in XML?

public enum e_Type 
{ 
    e_Unknown, 
    e_Categoric, 
    e_Numeric 
} 

Meine Variable wie folgt erklärt wird ...

private e_Type type; 

ich es will, wie diese in einem XML-Tag gehen ...

<type>value</type> 

Was ist die beste Vorgehensweise für persistente Werte von Enums in XML?

Antwort

7

Nachdem ich Antworten auf Bibliotheken von Drittanbietern erhalten hatte, beschloss ich, es selbst zu reparieren und dachte, ich würde meine Lösung posten, für den Fall, dass es jemand anderes sehen sollte. Habe ich nur noch zwei statische Methoden der Enum, die darauf achten, was zu XML hin und her zu schicken ...

public enum e_Type 
{ 
    e_Unknown, 
    e_Categoric, 
    e_Numeric; 
    public static e_Type type(String token) 
    { 
     return e_Type.valueOf(token); 
    } 
    public static String token(e_Type t) 
    { 
     return t.name(); 
    } 
} 

Das ist für mich ein guter Ansatz ist, weil es bedeutet, dass ich meine Getter und Setter mit dem Anruf kann type() - und token() -Methoden während der Serialisierung/Deserialisierung. Ich habe das in alle meine enums ausgedehnt.

Ich habe zwei Hauptprobleme mit einer 3rd-Party-Bibliothek für so etwas wie dies mit:

  1. aufblasen. Das ist eine Menge Vorschlaghammer für meine kleine Nuss
  2. Abhängigkeit. Hinzufügen einer neuen 3rd-Party-Bibliothek bedeutet, dass ich durch Lizenzierung und rechtliche Kontrollen und ESCROW etc. gehen muss. Wirklich nicht wert für 8 Zeilen Code.
+0

amen - +1 für die einfache, einfache Lösung eines eng definierten Problems! –

5

Versuchen Sie mit XStream, es ist eine Bibliothek, um ein Objekt aus und in XML zu konvertieren und Enums zu unterstützen.

String xml = xstream.toXML(enumObject); 

http://x-stream.github.io/converters.html

+1

das ist eine Menge Infrastruktur nur für die Serialisierung eines einzelnen Wertes ... – Simon

2

Ein weiterer Rahmen ist Simple XML Serialization, die zu C# XML-Serialisierung ähnlich ist. Es kann mit jedem Objektdiagramm umgehen, einschließlich solchen, die Enums enthalten.

Die Serialisierung von Enums verwendet die final name() -Methode, so dass sie immer aus XML wiederhergestellt werden können.

+0

auch eine Menge Infrastruktur für solch eine scheinbar einfache Aufgabe. Ich bin überrascht, dass es keinen einheimischen Weg gibt. Ich werde googeln den endgültigen Namen(), was Sie hier beziehen. – Simon

+0

Ya, es ist einfach genug zu Enum.name() und extrahieren Sie es zurück mit Enum.valueOf (Class, String), hier übergeben Sie einfach die Klasse der enum und den Wert von Enum.name(). Und du hast die enum aus ihrem Textformat wiederhergestellt :) –

8

haben einen Blick auf JAXB Annotationen, die Teil des JDK sind:

public static void main(String[] args) throws Exception { 
    JAXBContext context = JAXBContext.newInstance(Foo.class); 
    StringWriter sw = new StringWriter(); 
    context.createMarshaller().marshal(new Foo(), sw); 
    System.out.println(sw); 
} 

@XmlRootElement 
public static class Foo { 
    @XmlElement 
    private e_Type type = e_Type.e_Unknown; 
} 

@XmlEnum 
public enum e_Type { 
    e_Unknown, 
    e_Categoric, 
    e_Numeric 
} 

Sie weiter die Ausgabe anpassen können, z.B. Wenn Sie Ihre externe XML-Darstellung, anders zu sein von Ihrem internen Java-Enum Itemnamen gesucht:

@XmlEnumValue("UNKNOWN") 
e_Unknown 

btw: Es ist eine sehr starke Konvention Großbuchstaben Namen für Java-Klassen/Aufzählungen

0

würde ich verwenden zweite Abstimmung für JAXB 2 und XStream ist auch gut. Simple sieht XStream sehr ähnlich. Beachten Sie auch, dass die Verwendung von Anmerkungen optional ist - in den meisten Fällen können Felder und/oder Methoden automatisch verwendet werden.Und Sie müssen überhaupt keine XML-Schemas verwenden (Sie können, wenn Sie wollen): Viele Websites behaupten, Sie tun, aber das ist falsch (selbst die einfache Seite beanspruchte so etwas).

Zu externen Abhängigkeiten: Wenn Sie auf JDK 1.6 laufen, kommt es mit gebündelter Implementierung von JAXB (nicht nur die API!). Während es aufgebläht ist, dass JDK ohne könnte (da nicht jeder es braucht, diejenigen, die es tun könnten, nur d/l es IMO), ist es schön, wenn Sie es brauchen. Und Implementierung ist sehr gut, sehr schnell (50-70% Geschwindigkeit von nur Roh-XML-Parsing oder Schreiben).

1

Ich mag den ersten Ansatz. Für solch eine einfache Aufgabe müssen keine Bibliotheken von Drittanbietern hinzugefügt werden. Wenn der serialisierte Wert == gemacht wird, bedeutet das enum constant literal (d. H. "E_Unknown", "e_Categoric", "e_Numeric"), dass der Entwickler die Variablennamen unlesbar macht, wenn er die Variablennamen umbenennt. Zum Beispiel speichern Sie e_Unknown in Ihrem XML, später umbenennen Sie die Konstante als UNBEKANNT (aus Gründen der Nomenklatur). Sie können dann keine alten Werte abrufen.

Ein anderer Ansatz besteht darin, jeder Enumeration einen Geschäftswert zuzuordnen und den Geschäftswert in der Datenbank zu speichern, damit die Umbenennung/Umgestaltung von Konstantennamen keine alten gespeicherten Werte bricht. Ich habe über dieses Problem gebloggt, wenn Sie weitere Erläuterungen benötigen: 3 ways to serialize Java Enums