Khi bạn tuần tự hóa các đối tượng bằng cách sử dụng ObjectOutputStream
, luồng sẽ 'ghi nhớ' đối tượng mà nó đã viết. Khi nó phải viết cùng một đối tượng một lần nữa, nó sẽ không viết toàn bộ đối tượng một lần nữa, thay vào đó nó sẽ viết một định danh được gọi là 'tham chiếu ngược lại'.
Việc nhận ObjectInputStream
cũng sẽ theo dõi các đối tượng đã được nhận và sẽ - khi đọc một tham chiếu ngược - trả lại cùng một đối tượng mà nó đọc trước đó.
Như được giải thích trong answer by CoronA, đây là một trong số những thứ khác - được sử dụng để tuần tự hóa các đối tượng trỏ đến nhau, mà còn để đảm bảo bình đẳng danh tính trong một JVM được giữ nguyên khi tuần tự hóa với một JVM khác.
Phương pháp readUnshared
(và bộ phận truy cập writeUnshared
) được sử dụng để thoát khỏi hành vi này: nó đảm bảo rằng đối tượng đọc (được viết) sẽ là duy nhất (và không được sử dụng lại làm tham chiếu ngược). Điều này là khá tiên tiến và tôi không thể nhớ bao giờ đã thấy hoặc đã sử dụng nó, nhưng sau đó một lần nữa, tôi hiếm khi thấy việc sử dụng serialization ở tất cả.
Nguồn
2016-09-26 07:10:58
Đó không phải là những gì mà tham chiếu ngược đề cập đến.Nó không liên quan gì tới các tham chiếu vòng tròn, mặc dù chúng sẽ được hưởng lợi rất nhiều từ các tham chiếu ngược. – 4castle
Nối tiếp một cấu trúc tròn như thế bằng cách sử dụng 'writeUnshared' sẽ ném một' StackOverflowException'. – 4castle
Theo quan điểm của tôi, có một số tình huống cần có sự phản hồi. Và tham chiếu vòng tròn là một phần của chúng. Có - writeUnshared có thể sẽ thất bại, nhưng tại thời điểm tôi viết câu trả lời này không ai được đề cập readUnshared. – CoronA