2013-03-20 1 views
6

У меня есть Java Enum, как показано ниже:Пользовательские поля на Java перечисление не получаю сериализованная

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 
} 

Я вижу, что после десериализации, пользовательские поля на перечисление теряются. При чтении больше об этом я получил впечатление, что перечисление десериализуется в строку, и поэтому его пользовательские поля игнорируются.

Если это правда, я злоупотребляю Enum здесь & следует просто использовать POJO istead? Или есть способ сериализации пользовательских полей (которые не являются частью конструктора)?

Спасибо!

+2

Пойдите с pojo. См. Ссылку здесь для получения информации о сериализации Enum: http://docs.oracle.com/javase/1.5.0/docs/guide/serialization/relnotes15.html – nattyddubbs

+0

Еще одна ссылка о сериализации enums http://docs.oracle .com/javase/1.5.0/docs/guide/serialization/spec/serial-arch.html # enum –

ответ

7

Если значения постоянны, это лучше, и вам не нужно сериализовать что-нибудь

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 
    } 
} 

Если вы устанавливаете эти значения во время выполнения, моя склонность будет то, что это не должно быть перечисление в первую очередь - должно существовать отдельное POJO, которое, возможно, содержит значения, а также ссылку на значение перечисления.

+1

Можете также сделать эти поля «final», если они не подлежат изменению. – nattyddubbs

+0

Интересно, будет ли этот подход (с сеттерами) означать, что сериализованное перечисление не будет содержать последние значения 'incremental' или' someStr', но вместо этого будет сериализовано со значениями по умолчанию. – yshavit

+1

@yshavit - Он не будет удерживать состояние. Если вы используете сеттеры за пределами перечисления, это не должно быть перечисление. – dfb

5

От Java language specification:

Окончательный метод клонирования в Enum гарантирует, что перечисляемые константы никогда не может быть клонированы и специальная обработка с помощью механизма сериализации гарантирует, что дублирующие экземпляры никогда не создаются в результате от десериализация. Отражающее создание типов перечислений запрещено. Вместе эти четыре вещи гарантируют, что экземпляры типа перечисления не существуют, кроме тех, которые определены константами перечисления.

То, о чем вы просите, создало бы более одного экземпляра, скажем, TYPE_A. Это сломает перечисления. Перечисления должны быть неизменными.

+0

Им не обязательно быть апатридом, они просто не должны иметь изменчивого состояния. – yshavit

+1

@yshavit - Спасибо; Я изменил формулировку на «неизменную», чтобы устранить любую двусмысленность. – McDowell

+0

Спасибо @McDowell & yshavit - Я думаю: «Им не обязательно быть апатридом, они просто не должны иметь изменчивого состояния». вероятно, подводит итог! –