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()
.
Di Jawa ini diselesaikan dengan caching objek berseri dan menulis pegangannya ketika ditulis lagi.
Lihat langkah 5 di http://docs.oracle.com/javase/6/docs/platform/serialization/spec/output.html .
sumber