2014-07-07 12 views
7

Tôi đọc các tài liệu của giao diện Serializable, trong đó tôi thấy những dòng sau:Tại sao lớp cơ sở (không triển khai Serializable) nên không có hàm tạo đối số nếu lớp con của nó triển khai Serializable?

Để cho phép phân nhóm các lớp phi serializable để được tuần tự, các kiểu phụ có thể chịu trách nhiệm cho việc lưu và khôi phục lại trạng thái của các trường gói công khai, được bảo vệ và (nếu có thể truy cập) của supertype. Loại con có thể giả định trách nhiệm này chỉ khi lớp nó mở rộng có một hàm khởi tạo no-arg có thể truy cập để khởi tạo trạng thái của lớp. Đó là một lỗi để khai báo một lớp Serializable nếu đây không phải là trường hợp. Lỗi sẽ được phát hiện khi chạy.

Nhưng vai trò của hàm tạo no-arg của lớp cơ sở trong khôi phục trạng thái của đối tượng là gì?

+0

Xem http://www.jguru.com/faq/view.jsp?EID=251942 – GKislin

Trả lời

13

Khi bạn cố gắng deserialize một đối tượng serializable, cơ chế phải tạo một trường hợp rỗng của đối tượng, và điền vào các thành viên, để khôi phục lại đối tượng trạng thái khi được đăng. Một hàm tạo của một đối tượng tuần tự hóa sẽ được gọi khi đối tượng được xây dựng lần đầu tiên, nhưng các nhà xây dựng KHÔNG được gọi trong quá trình deserialization bởi vì, về mặt kỹ thuật, bạn không xây dựng đối tượng, thay vào đó là tái tạo nó trước đó. Bất kỳ tác động của việc xây dựng và thao tác sau đó được mong đợi đã được tích hợp vào trạng thái đối tượng.

Bất cứ khi nào bạn xây dựng một đối tượng của bất kỳ lớp, Java phải gọi một constructor của lớp siêu, và các siêu-super-class, vv Bạn có thể chỉ định một constructor cụ thể cho các lớp siêu bằng cách sử dụng super(...) hoặc nếu bạn don Không chỉ định một hàm tạo siêu, hàm tạo mặc định sẽ được sử dụng. Bằng cách này hay cách khác, tất cả các lớp vào thư mục gốc đều được xây dựng.

Deserialization của các đối tượng serlializable không gây constructor gọi, nhưng khi có một lớp siêu đó không phải là serializable, (có nghĩa là bạn mở rộng một lớp không serializable với một lớp serializable) thì lớp đó không hy vọng được deserialized, và nó không có cơ chế để lưu trữ/khôi phục các thành viên của nó. Nếu lớp siêu không được tuần tự hóa, cơ chế deserialization cần gọi hàm tạo không đối số để đảm bảo rằng thể hiện đối tượng được hoàn nguyên được khởi tạo đúng.

Nếu bạn không chỉ định hàm tạo không đối số, mã deserialization sẽ không cảnh báo bạn về vấn đề này cho đến lần thử đầu tiên của bạn để deserialize đối tượng của lớp đó. Không có cảnh báo tại thời gian biên dịch.

Hơn nữa, lớp con tuần tự hóa của bạn phải chịu trách nhiệm lưu trữ/khôi phục bất kỳ giá trị thành viên nào từ lớp siêu không tuần tự.

+0

phương thức khởi tạo của lớp cơ sở luôn chạy theo tuần tự không? – YakRangi

+0

nếu siêu lớp có thể tuần tự hóa được thì không có hàm tạo arg nào là không cần thiết vì đối tượng lớp dẫn xuất sẽ tự động lưu phần lớp cơ sở vì phần đó là serializable.không phải nó.] – YakRangi

+0

giả sử nếu chúng ta có một hàm tạo arg không có arg trong lớp cơ sở không được tuần tự hóa, chúng có được gọi là không? – YakRangi

0

Trong trường hợp siêu lớp không thể Serializable hơn là tuần tự hóa đối tượng của lớp con, chúng ta phải triển khai giao diện serializable trong phân lớp một cách rõ ràng. Trong trường hợp này, superclass phải có một hàm tạo không có đối số trong nó.

Nếu siêu lớp không phải là Serializable thì tất cả giá trị của các biến mẫu được thừa kế từ lớp siêu sẽ được khởi tạo bằng cách gọi hàm tạo của lớp siêu không siêu tuần tự trong quá trình deserialization.

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