Điều gì xảy ra nếu chúng ta tuần tự hóa và giải tuần tự hóa hai đối tượng tham chiếu đến nhau?


15

Để làm cho nó rõ ràng hơn, đây là một ví dụ nhanh:

class A implements Serializable { public B b; }
class B implements Serializable { public A a; }
A a = new A();
B b = new B();
a.b = b;
b.a = a;

Vậy điều gì sẽ xảy ra nếu chúng ta tuần tự hóa các đối tượng a và b thành một tệp và giải tuần tự hóa từ tệp đó?

Tôi nghĩ rằng chúng tôi nhận được 4 đối tượng, mỗi đối tượng 2. Đối tượng giống hệt nhau nhưng trường hợp khác nhau.

Nhưng tôi không chắc có gì khác hay nó đúng hay sai.

Nếu có bất kỳ công nghệ nào cần trả lời, xin vui lòng suy nghĩ dựa trên Java.

Cảm ơn bạn.

Câu trả lời:


25

Java theo dõi các đối tượng đã được ghi vào luồng và các phiên bản tiếp theo được viết dưới dạng ID, không phải là một đối tượng được tuần tự hóa thực tế.

Vì vậy, ví dụ của bạn, nếu bạn viết ví dụ "a" vào luồng, luồng sẽ cung cấp cho đối tượng đó một ID duy nhất (giả sử "1"). Là một phần của tuần tự hóa "a", bạn phải tuần tự hóa "b" và luồng cung cấp cho nó một id khác ("2"). Nếu sau đó bạn viết "b" cho luồng, điều duy nhất được viết là ID, không phải đối tượng thực tế.

Luồng đầu vào thực hiện điều tương tự ngược lại: đối với mỗi đối tượng mà nó đọc từ luồng, nó gán một số ID bằng thuật toán tương tự như luồng đầu ra và số ID đó tham chiếu thể hiện đối tượng trong bản đồ. Khi nó nhìn thấy một đối tượng được tuần tự hóa bằng ID, nó sẽ lấy ra thể hiện ban đầu từ bản đồ.

Đây là cách các tài liệu API mô tả nó:

Nhiều tham chiếu đến một đối tượng được mã hóa bằng cơ chế chia sẻ tham chiếu để đồ thị của các đối tượng có thể được khôi phục về hình dạng giống như khi bản gốc được viết

Hành vi này có thể gây ra sự cố: vì luồng giữ tham chiếu cứng đến từng đối tượng (để biết khi nào cần thay thế ID), bạn có thể hết bộ nhớ nếu bạn viết nhiều đối tượng tạm thời vào luồng. Bạn giải quyết điều đó bằng cách gọi reset().


Vì vậy, nó sẽ làm cho nó trở lại trạng thái ban đầu sau khi khử lưu huỳnh, phải không? Vì nó là trước khi tuần tự hóa với các tham chiếu cho nhau?
Seregwethrin

1
Vâng, cuối cùng bạn chỉ có 2 đối tượng, tham khảo lẫn nhau.
hectorct

1
Tôi không thể tin Java xử lý việc này tự động. Tôi rất ấn tượng
Cruncher

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.