2013-05-08 38 views
6

Lớp con của tôi triển khai Serializable, nhưng lớp cha của tôi thì không.Tuần tự hóa có lưu các trường siêu lớp không?

Cả lớp con và lớp cha đều chứa các biến cần được lưu như một phần của trạng thái của lớp con.

Tuần tự hóa có lưu các trường siêu lớp không?

+0

http://stackoverflow.com/questions/8632148/java-object-serialization-and-inheritance –

Trả lời

3

Nếu siêu lớp không phải là Serializable trường sẽ không được đăng theo thứ tự. Bạn cần gì hơn để có hàm tạo no-args trong superclass.

Như tài liệu nói:

Trong deserialization, các lĩnh vực của các tầng lớp phi serializable sẽ được khởi tạo sử dụng công hoặc bảo vệ không-arg constructor của lớp. Một constructor no-arg phải được truy cập tới lớp con có thể tuần tự hóa được.

+0

Làm thế nào để tôi biết nếu cha là hoặc không phải là 'Serializable'? – Danijel

+0

Bạn có thể kiểm tra giao diện nào nó thực hiện. –

+0

hoặc bạn có thể kiểm tra bằng cách sử dụng toán tử instanceof – Amol

19

Một lĩnh vực lớp cha không thể được đăng nếu nó chưa Serializable.Here là tóm tắt một số quy tắc của Java serialization:

  • Một đối tượng là serializable chỉ khi các lớp học hoặc lớp cha của nó thực hiện các Serializable (hoặc Externalizable) giao diện.

  • Một đối tượng có thể tuần tự hóa (tự thực hiện giao diện Serializable) ngay cả khi siêu lớp của nó không. Tuy nhiên, lớp đầu tiên trong phân cấp của lớp tuần tự hóa, mà không thực hiện giao diện Serializable, PHẢI có một hàm tạo no-arg. Nếu điều này bị vi phạm, readObject() sẽ tạo ra java.io.InvalidClassException trong thời gian chạy.

  • Biến tố không-arg của mọi siêu lớp không tuần tự hóa sẽ chạy khi đối tượng được deserialized. Tuy nhiên, các đối tượng deserialized? constructor không chạy khi nó được deserialized.

  • Lớp học phải hiển thị tại điểm tuần tự hóa.

  • Tất cả các loại nguyên thủy đều có thể tuần tự hóa.

  • Các trường tạm thời (có công cụ sửa đổi tạm thời) KHÔNG được đăng, (tức là, không được lưu hoặc khôi phục). Một lớp thực hiện các trường có nhãn Serializablemust -transient của các lớp không hỗ trợ tuần tự hóa (ví dụ: luồng tệp).

  • Trường tĩnh (có công cụ sửa đổi tĩnh) không được đăng.

  • Nếu biến thành viên của một đối tượng có thể tuần tự hóa tham chiếu đến đối tượng không thể tuần tự hóa, mã sẽ biên dịch nhưng một RumtimeException sẽ bị ném.

+0

Rất hữu ích, cảm ơn. – Danijel

+4

Vui lòng cung cấp nguồn nếu bạn giải pháp sao chép-dán (cho bất kỳ người nào quan tâm: http://www.xyzws.com/Javafaq/what-are-rules-of-serialization-in-java/208) –

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