Apa yang terjadi jika kita membuat cerita bersambung dan membatalkan dua objek yang saling rujukan?

15

Untuk membuatnya lebih jelas, ini adalah contoh cepat:

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;

Jadi apa yang terjadi jika kita membuat serial a dan b objek ke dalam file dan deserialize dari file itu?

Saya pikir kami mendapatkan 4 objek, masing-masing 2. Objek identik tetapi contoh berbeda.

Tetapi saya tidak yakin apakah ada hal lain atau itu benar atau salah.

Jika ada teknologi yang perlu dijawab, silakan pikirkan berdasarkan Java.

Terima kasih.

Seregwethrin
sumber

Jawaban:

25

Java melacak objek yang telah ditulis ke stream, dan instance berikutnya ditulis sebagai ID, bukan objek serial aktual.

Jadi, sebagai contoh Anda, jika Anda menulis instance "a" ke stream, stream memberikan objek itu ID unik (misalkan "1"). Sebagai bagian dari serialisasi "a", Anda harus membuat serial "b", dan streaming memberinya id lain ("2"). Jika Anda kemudian menulis "b" ke stream, satu-satunya hal yang ditulis adalah ID, bukan objek yang sebenarnya.

Aliran input melakukan hal yang sama secara terbalik: untuk setiap objek yang dibacanya dari aliran, ia memberikan nomor ID menggunakan algoritma yang sama dengan aliran output, dan nomor ID referensi objek contoh dalam peta. Ketika melihat objek yang diserialisasi menggunakan ID, ia mengambil instance asli dari peta.

Ini adalah bagaimana dokumentasi API menggambarkannya:

Beberapa referensi ke satu objek dikodekan menggunakan mekanisme berbagi referensi sehingga grafik objek dapat dikembalikan ke bentuk yang sama seperti ketika aslinya ditulis

Perilaku ini dapat menyebabkan masalah: karena stream menyimpan referensi keras ke setiap objek (sehingga tahu kapan harus mengganti ID), Anda dapat kehabisan memori jika Anda menulis banyak objek transien ke stream. Anda menyelesaikannya dengan menelepon reset().

parsifal
sumber
Jadi itu akan membuatnya kembali ke keadaan semula setelah deserialisasi, kan? Seperti sebelum serialisasi dengan referensi satu sama lain?
Seregwethrin
1
Ya, Anda berakhir hanya dengan 2 objek, saling referensi.
hectorct
1
Saya tidak percaya Java menangani ini secara otomatis. Saya terkesan
Cruncher