Birbirine gönderme yapan iki nesneyi serileştirip serileştirirsek ne olur?


15

Daha açık bir şekilde ifade etmek gerekirse, bu hızlı bir örnektir:

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;

Öyleyse a ve b nesnelerini bir dosyaya serileştirirsek ve bu dosyadan serileştirirsek ne olur?

Her biri 2 tane olmak üzere 4 nesne elde ettiğimizi sanıyordum. Özdeş nesneler ama farklı örnekler.

Ama başka bir şey olup olmadığından emin değilim ya da doğru mu yanlış mı.

Yanıtlamak için herhangi bir teknoloji gerekiyorsa, lütfen Java tabanlı düşünün.

Teşekkür ederim.

Yanıtlar:


25

Java, akışa yazılan nesneleri izler ve sonraki örnekler, gerçek bir serileştirilmiş nesne olarak değil, kimlik olarak yazılır.

Örneğin, örneğin, akışa "a" örneği yazarsanız, akış bu nesneye benzersiz bir kimlik verir (diyelim "1" diyelim). "A" serileştirmesinin bir parçası olarak, "b" yi serileştirmeniz gerekir ve akış buna başka bir kimlik ("2") verir. Akıma "b" yazarsanız, yazılan tek şey gerçek nesne değil kimliktir.

Giriş akışı tersini yapar: akıştan okuduğu her nesne için, çıkış akışıyla aynı algoritmayı kullanarak bir kimlik numarası atar ve bu kimlik numarası bir haritadaki nesne örneğine başvurur. Kimlik kullanılarak serileştirilmiş bir nesne gördüğünde, orijinal örneği haritadan alır.

Bu nasıl API dosyaları bunu açıklamaktadır:

Tek bir nesneye yapılan birden fazla başvuru, bir referans paylaşım mekanizması kullanılarak kodlanır, böylece nesnelerin grafikleri orijinalin yazıldığı zamanla aynı şekilde geri yüklenebilir

Bu davranış sorunlara neden olabilir: Akış her nesneye sabit bir başvuru içerdiğinden (kimliğin ne zaman değiştirileceğini bilmesi için), akışa çok fazla geçici nesne yazarsanız belleğiniz tükenebilir. Bunu arayarak çözersiniz reset().


Bu, serileştirmeden sonra orijinal durumuna geri dönmesini sağlayacak, değil mi? Birbirine referanslarla serileştirmeden önce olduğu gibi?
Seregwethrin

1
Evet, sadece iki nesne ile sonuçlanırsınız.
hectorct

1
Java'nın bunu otomatik olarak ele aldığına inanamıyorum. Etkilendim
Cruncher

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.