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()
.