Java відслідковує об'єкти, записані в потік, а наступні екземпляри записуються як ідентифікатор, а не фактичний серіалізований об’єкт.
Так, для вашого прикладу, якщо ви пишете екземпляр "a" в потік, потік надає цьому об'єкту унікальний ідентифікатор (скажімо, "1"). У рамках серіалізації "a" вам доведеться серіалізувати "b", і потік надає йому інший id ("2"). Якщо ви потім записуєте "b" у потік, єдине, що записується, - це ідентифікатор, а не власне об'єкт.
Потік введення робить те саме, що відбувається в зворотному порядку: кожному об'єкту, який він читає з потоку, він присвоює ідентифікаційний номер, використовуючи той же алгоритм, що і вихідний потік, і цей ідентифікаційний номер посилається на екземпляр об'єкта на карті. Коли він бачить об'єкт, який був серіалізований за допомогою ідентифікатора, він отримує оригінальний екземпляр з карти.
Ось як це описують документи API :
Кілька посилань на один об'єкт кодуються за допомогою механізму обміну посиланнями, щоб графіки об'єктів могли бути відновлені в тій же формі, що і при написанні оригіналу
Така поведінка може спричинити проблеми: оскільки потік суворо посилається на кожен об'єкт (щоб він знав, коли замінити ідентифікатор), у вас може залишитися пам'ять, якщо ви записуєте в потік багато перехідних об'єктів. Ви вирішите це, зателефонувавши reset()
.