2013-07-21 38 views
5

Mặc định deserialization của các loại enum trong Java bị giới hạn là readObjectreadObjectNoData ném InvalidObjectException. Vì lý do này, các loại enum là hoàn hảo để triển khai các lớp đơn lẻ mà không có bất kỳ lỗ hổng nào (Mục 77, Java hiệu quả, ấn bản thứ hai, Bloch).Deserialization enum trong Java

  • Tại sao, trên thực tế, các loại enum thực hiện Serializable?
  • Làm cách nào để tham chiếu enum được deserialized trong thực tế?

Trả lời

3

Loại enum thực hiện Serializable để bạn có thể tuần tự hóa các đối tượng chứa hằng số enum. Enum hằng số được deserialized trong cùng một cách như bất kỳ objest khác: bằng cách sử dụng ObjectInputStream.readObject(). Các hằng số enum được mã hóa khác với các thể hiện của các lớp thông thường, vì vậy ObjectInputStream.readObject() có thể deserialize chúng mà không cần gọi phương thức readObject của chúng. Có các lớp khác sử dụng mã hóa đặc biệt, trong số đó là StringClass. Xem documentation để biết thêm chi tiết.

Nếu bạn muốn tự mình triển khai các lớp đơn tuần tự, hãy xem phương thức readResolve.

+0

Vâng, điểm # 1 có câu trả lời ở đây. Các lớp có chứa tham chiếu enum không chỉ bị lỗi khi tuần tự hóa. Tôi cố gắng xóa mặc định, và nó hoạt động đơn giản! Sau đó, tại sao, có rất nhiều bài viết thảo luận về hiệu quả deserializing enums (chỉ để phục vụ mã tái factoring)? – abksrv