2013-03-20 6 views
6

ich eine Java Enum haben, wie unten gezeigt:Benutzerdefinierte Felder auf Java-Enumeration nicht serialisiert bekommen

public enum ExecutionMode { 
    TYPE_A, 
    TYPE_B, 
    TYPE_C; 

    private ExecutionMode(){} //no args constr- no really required 

    private boolean incremental; //has get/set 
    private String someStr;  //has get/set 
} 

Ich sehe, dass die benutzerdefinierten Felder auf dem ENUM nach Deserialisierung verloren. Wenn ich mehr darüber gelesen habe, habe ich den Eindruck, dass die Enumeration in eine Zeichenkette deserialisiert wird und daher die benutzerdefinierten Felder ignoriert werden.

Wenn es wahr ist, missbrauche ich Enum hier & sollte nur POJO istead verwenden? Oder gibt es eine Möglichkeit, die benutzerdefinierten Felder (die nicht Teil des Konstruktors sind) zu serialisieren?

Danke!

+2

Gehen Sie mit dem pojo. Siehe Link hier für Informationen über 'Enum' Serialisierung: http://docs.oracle.com/javase/1.5.0/docs/guide/serialization/relnotes15.html – nattyddubbs

+0

Ein weiterer Link über Enums Serialisierung http://docs.oracle .com/javase/1.5.0/docs/guide/serialisierung/spec/serial-arch.html # enum –

Antwort

7

Wenn die Werte konstant sind, ist dies besser und Sie müssen nichts

public enum ExecutionMode { 
    TYPE_A(x,t), 
    TYPE_B(y,z), 
    TYPE_C(b,s) 

    private boolean incremental; //has get/set 
    private String someStr;  //has get/set 

    ExecutionMode(boolean incremental,String someStr){ 
     ///... set things appropriately 
    } 
} 

serialisiert Wenn Sie diese Werte zur Laufzeit sind einstellen, würde meine Neigung sein, dass dies keine sein sollte enum an erster Stelle - es sollte ein separates POJO geben, das vielleicht die Werte sowie einen Verweis auf einen enum-Wert enthält.

+1

Kann auch diese Felder 'final' machen, wenn sie nicht geändert werden sollen. – nattyddubbs

+0

Ich frage mich, ob dieser Ansatz (mit Setter) bedeuten würde, dass die serialisierte Aufzählung nicht die neuesten Werte von "incremental" oder "someStr" enthalten würde, sondern stattdessen mit den Standardwerten serialisiert werden würde. – yshavit

+1

@yshavit - Es wird nicht den Staat halten. Wenn Sie Setter außerhalb der Enumeration verwenden, sollte es keine Enumeration sein. – dfb

5

Von dem Java language specification:

Die letzte Klon-Methode in Enum stellt sicher, dass Enum-Konstanten können nie geklont werden, und die Sonderbehandlung durch den Serialisierungsmechanismus sorgt dafür, dass doppelte Instanzen nie als Ergebnis erstellt von Deserialisierung. Reflektierende Instanziierung von Enum-Typen ist verboten. Zusammen sorgen diese vier Dinge dafür, dass keine Instanzen eines Enum-Typs existieren, die über die Enum-Konstanten hinausgehen.

Wonach Sie fragen, würde mehr als eine Instanz von beispielsweise TYPE_A erstellen. Dies würde Enums brechen. Enums sollten unveränderlich sein.

+0

Sie müssen nicht staatenlos sein, sie sollten keinen veränderlichen Zustand haben. – yshavit

+1

@yshavit - Danke; Ich habe den Wortlaut auf "unveränderlich" geändert, um Unklarheiten zu beseitigen. – McDowell

+0

Danke @McDowell & yshavit - Ich denke "Sie müssen nicht staatenlos sein, sie sollten einfach keinen veränderlichen Zustand haben." wahrscheinlich fasst es zusammen! –

Verwandte Themen