Що станеться, якщо ми серіалізуємо та десеріалізуємо два об’єкти, які посилаються один на одного?


15

Щоб зробити це більш зрозумілим, це швидкий приклад:

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;

Що ж станеться, якщо ми серіалізуємо об'єкти a і b у файл і деріаріалізуємо з цього файлу?

Я думав, ми отримаємо 4 об’єкти, по 2 з кожного. Ідентичні об'єкти, але різні екземпляри.

Але я не впевнений, чи є щось інше чи це правильно чи неправильно.

Якщо для відповіді потрібна будь-яка технологія, будь ласка, подумайте на базі Java.

Дякую.

Відповіді:


25

Java відслідковує об'єкти, записані в потік, а наступні екземпляри записуються як ідентифікатор, а не фактичний серіалізований об’єкт.

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

Потік введення робить те саме, що відбувається в зворотному порядку: кожному об'єкту, який він читає з потоку, він присвоює ідентифікаційний номер, використовуючи той же алгоритм, що і вихідний потік, і цей ідентифікаційний номер посилається на екземпляр об'єкта на карті. Коли він бачить об'єкт, який був серіалізований за допомогою ідентифікатора, він отримує оригінальний екземпляр з карти.

Ось як це описують документи API :

Кілька посилань на один об'єкт кодуються за допомогою механізму обміну посиланнями, щоб графіки об'єктів могли бути відновлені в тій же формі, що і при написанні оригіналу

Така поведінка може спричинити проблеми: оскільки потік суворо посилається на кожен об'єкт (щоб він знав, коли замінити ідентифікатор), у вас може залишитися пам'ять, якщо ви записуєте в потік багато перехідних об'єктів. Ви вирішите це, зателефонувавши reset().


Тож це змусить повернутися до початкового стану після десеріалізації, правда? Як це до серіалізації з посиланнями один на одного?
Seregwethrin

1
Так, у вас є лише 2 об'єкти, посилаючись один на одного.
Гекторкт

1
Я не можу повірити, що Java обробляє це автоматично. Мене вражає
Cruncher

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.