2013-03-20 32 views
6

Tôi có một Enum Java như hình dưới đây:lĩnh vực Custom trên java enum không nhận được serialized

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 
} 

tôi thấy rằng sau khi deserialization, các lĩnh vực tùy chỉnh trên enum bị mất. Khi đọc thêm về nó, tôi có ấn tượng rằng enum được deserialized thành một chuỗi và do đó các lĩnh vực tùy chỉnh của nó được bỏ qua.

Nếu đúng, tôi có lạm dụng Enum ở đây & chỉ nên sử dụng POJO istead? Hoặc có cách nào để tuần tự hóa các trường tùy chỉnh (không phải là một phần của hàm tạo) không?

Cảm ơn!

+2

Đi kèm với thơ. Xem liên kết ở đây để biết thêm thông tin về chuỗi tuần tự 'Enum': http://docs.oracle.com/javase/1.5.0/docs/guide/serialization/relnotes15.html – nattyddubbs

+0

Một liên kết khác về tuần tự enum http://docs.oracle .com/javase/1.5.0/docs/guide/serialization/spec/serial-arch.html # enum –

Trả lời

7

Nếu các giá trị là hằng số, đây là tốt hơn và bạn không cần phải serialize bất cứ điều gì

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

Nếu bạn đang thiết những giá trị này khi chạy, độ nghiêng của tôi sẽ được rằng đây không phải là một enum ở vị trí đầu tiên - phải có một POJO riêng biệt có lẽ chứa các giá trị cũng như tham chiếu đến một giá trị enum.

+1

Cũng có thể làm cho các trường đó 'final' quá nếu chúng không bị thay đổi. – nattyddubbs

+0

Tôi tự hỏi nếu cách tiếp cận này (với setters) có nghĩa là enum serialized sẽ không chứa các giá trị mới nhất của 'incremental' hoặc' someStr', nhưng thay vào đó được serialized với các giá trị mặc định. – yshavit

+1

@yshavit - Nó sẽ không giữ trạng thái. Nếu bạn đang sử dụng setters bên ngoài enum, nó không phải là một enum. – dfb

5

Từ Java language specification:

Các phương pháp nhân bản cuối cùng trong Enum đảm bảo rằng hằng enum có thể không bao giờ được nhân bản vô tính, và điều trị đặc biệt bởi cơ chế serialization đảm bảo rằng các trường hợp trùng lặp không bao giờ được tạo ra như là một kết quả của deserialization. Phản ứng tức thời của các loại enum bị cấm. Cùng với nhau, bốn điều này đảm bảo rằng không có trường hợp nào của một loại enum tồn tại ngoài những trường hợp được xác định bởi hằng số enum.

Điều bạn đang yêu cầu sẽ tạo nhiều hơn một ví dụ, ví dụ: TYPE_A. Điều này sẽ phá vỡ enums. Enums nên không thay đổi.

+0

Họ không phải là người không quốc tịch, họ không nên có trạng thái có thể thay đổi được. – yshavit

+1

@yshavit - Cảm ơn; Tôi đã thay đổi từ ngữ thành "bất biến" để loại bỏ bất kỳ sự mơ hồ nào. – McDowell

+0

Cảm ơn @McDowell & yshavit - Tôi nghĩ "Họ không phải là người không quốc tịch, họ không nên có trạng thái có thể thay đổi được." có thể tổng hợp nó lên! –

Các vấn đề liên quan