2011-07-11 28 views
9

Mã dưới đây hoạt động như thế nào?Nối tiếp một đối tượng có lớp cha không tự tuần tự

 class A { 
     int a = 10; 
    } 


    class B extends A implements Serializable{ 

     } 



    public class Test { 
     public static void main(String[] args){ 
     B obj = new B(); 
     obj.a = 25; 


     //Code to serialize object B (B b= new B()), 
     // deserialize it and print the value of 'a'. 
     } 
    } 

Mã in 10 mặc dù tôi đã thay đổi giá trị 'a' trong mã.

Bất kỳ lời giải thích nào về hành vi này?

+2

Phương thức khởi tạo no-args của lớp cơ sở non-'Serializable' được sinh ra nhất được thực hiện, các lớp khác của đối tượng được deserialised như mong đợi. –

+0

Bạn nên sử dụng Mẫu proxy tuần tự để tuần tự hóa đúng cách (ví dụ: cũng sắp xếp thứ tự các trường chính). Xem ví dụ http://java.dzone.com/articles/serialization-proxy-pattern –

Trả lời

11

Giá trị mặc định là a là 10 - giá trị này sẽ được đặt thành 10 khi đối tượng được tạo. Nếu bạn muốn có một thử nghiệm thực tế, hãy đặt nó thành một giá trị khác sau khi khởi tạo và sau đó tuần tự hóa nó.

Đối với bản cập nhật của bạn - nếu một lớp không được tuần tự hóa, các trường của nó không được đăng và được tuần tự hóa. Chỉ các trường của các lớp con có thể tuần tự hóa được.

+0

Kiểm tra câu hỏi của bạn đã khiến tôi chỉnh sửa bài đăng :). – vinoth

+0

@cmv xem cập nhật – Bozho

+0

Chính xác. Câu trả lời của bạn mâu thuẫn với đầu ra của tôi. A không thể tuần tự hóa được. Nhưng tôi vẫn nhận được in a = 10, mặc dù tôi thay đổi giá trị thành 25 trong khi tạo ra cá thể B. – vinoth

7

B mở rộng A, nó A. Điều này có nghĩa là b instanceof Serializable trả lại true.

Vì vậy, miễn là đối tượng bạn cố gắng sắp xếp theo thứ tự trả về đúng cho séc instanceof Serializable, bạn có thể tuần tự hóa nó. Điều này áp dụng cho bất kỳ đối tượng hỗn hợp nào có trong chính đối tượng này.

Nhưng bạn không thể làm A a = new A(); và cố gắng tuần tự hóa a.

Hãy xem xét điều này:

java.lang.Object không thực hiện Serializable. Vì vậy, không ai có thể tuần tự hóa bất kỳ đối tượng nào trong Java trong trường hợp đó! Tuy nhiên, đó không phải là trường hợp nào cả. Ngoài ra, trong các dự án có nhiều JavaBeans liên quan đến việc mở rộng một loại siêu phổ biến, thực hành chung là làm cho loại siêu thực hiện Serializable để tất cả các lớp con không phải làm điều đó.

+1

+1 cho so sánh Đối tượng. Nhưng bạn nên thêm lý do tại sao giá trị mặc định của A được sử dụng. – Dorus

+0

xin lỗi, không nhận ra bạn đang trả lời câu hỏi ban đầu (hiện đã được sửa đổi), lấy lại -1 – Bozho

+0

@Bozho: Cái nào? Tôi đã chỉ giải thích khả năng serialize, không cho dù các trạng thái của các lĩnh vực sẽ được lưu/phục hồi. Vì vậy, không phải bất cứ điều gì tôi đã nói làm cho cảm giác hoàn toàn? – adarshr

0

Nếu lớp cha không thể tuần tự hóa, các trường của nó được khởi tạo mỗi lần đối tượng được deserialized. tức là Vật thể vẫn cần được xây dựng.

+0

Khó hiểu. Bạn không có nghĩa là đối tượng vẫn * được * xây dựng, ít nhất là các lớp cơ sở không có Serializable của nó? – EJP

2

Nếu lớp B kéo dài lớp A, và A là không serializable, sau đó tất cả các biến thể hiện của lớp A được khởi tạo với giá trị mặc định của họ (đó là 10 trong trường hợp này) sau khi de-serialization của lớp B.

+0

Rõ ràng và chính xác, theo kinh nghiệm. – bobismijnnaam

1

Nếu bạn là một lớp serializable, nhưng siêu lớp của bạn KHÔNG được nối tiếp, thì bất kỳ biến mẫu nào bạn INHERIT từ lớp cha đó sẽ được đặt lại về giá trị mà chúng được đưa ra trong quá trình xây dựng ban đầu của đối tượng. Điều này là do constructor class không serializable S W chạy! Trong thực tế, mọi hàm tạo ABOVE constructor lớp không tuần tự hóa đầu tiên cũng sẽ chạy, không có vấn đề gì, bởi vì một khi hàm tạo siêu đầu tiên được gọi, (trong quá trình deserialization), nó dĩ nhiên gọi hàm khởi tạo siêu của nó và như vậy trên cây thừa kế.

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