Co się stanie, jeśli serializujemy i deserializujemy dwa obiekty, które odnoszą się do siebie?

15

Aby to wyjaśnić, jest to szybki przykład:

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;

Co więc się stanie, jeśli serializujemy obiekty aib do pliku i deserializujemy z tego pliku?

Myślałem, że otrzymujemy 4 przedmioty, po 2 z każdego. Identyczne obiekty, ale różne instancje.

Ale nie jestem pewien, czy jest coś jeszcze, czy jest to dobre czy złe.

Jeśli jakaś technologia wymaga odpowiedzi, pomyśl w oparciu o Javę.

Dziękuję Ci.

Seregwethrin
źródło

Odpowiedzi:

25

Java śledzi obiekty, które zostały zapisane w strumieniu, a kolejne wystąpienia są zapisywane jako identyfikator, a nie rzeczywisty obiekt serializowany.

Na przykład, jeśli napiszesz instancję „a” do strumienia, strumień nadaje temu obiektowi unikalny identyfikator (powiedzmy „1”). W ramach serializacji „a” musisz serializować „b”, a strumień nadaje mu kolejny identyfikator („2”). Jeśli następnie napiszesz „b” do strumienia, jedyną zapisaną rzeczą jest identyfikator, a nie rzeczywisty obiekt.

Strumień wejściowy robi to samo w odwrotnym kierunku: dla każdego obiektu, który czyta ze strumienia, przypisuje numer identyfikacyjny przy użyciu tego samego algorytmu co strumień wyjściowy, a ten numer identyfikuje instancję obiektu na mapie. Kiedy widzi obiekt, który został zserializowany przy użyciu identyfikatora, pobiera oryginalne wystąpienie z mapy.

Tak opisują to dokumenty API :

Wiele odwołań do jednego obiektu jest kodowanych za pomocą mechanizmu współdzielenia odniesień, dzięki czemu wykresy obiektów można przywrócić do tego samego kształtu, jak w momencie pisania oryginału

Takie zachowanie może powodować problemy: ponieważ strumień zawiera twarde odwołanie do każdego obiektu (aby wiedział, kiedy zastąpić identyfikator), możesz zabraknąć pamięci, jeśli napiszesz do niego wiele obiektów przejściowych. Rozwiązujesz to, dzwoniąc reset().

parsifal
źródło
Czyli przywróci pierwotny stan po deserializacji, prawda? Jak to jest przed serializacją z odniesieniami do siebie?
Seregwethrin
1
Tak, masz tylko 2 obiekty, które się do siebie odnoszą.
hektorct
1
Nie mogę uwierzyć, że Java obsługuje to automatycznie. Jestem pod wrażeniem
Cruncher