Java ติดตามวัตถุที่ถูกเขียนไปยังกระแสข้อมูลและอินสแตนซ์ที่ตามมาจะถูกเขียนเป็น ID ไม่ใช่วัตถุต่อเนื่องที่เกิดขึ้นจริง
ดังนั้นสำหรับตัวอย่างของคุณหากคุณเขียนอินสแตนซ์ "a" ลงในสตรีมสตรีมจะให้ ID นั้นเป็นวัตถุที่ไม่ซ้ำกัน (สมมุติว่า "1") ในฐานะที่เป็นส่วนหนึ่งของการทำให้เป็นอนุกรมของ "a" คุณจะต้องทำให้เป็นอันดับ "b" และสตรีมจะให้ id อื่น ("2") หากคุณเขียน "b" ลงในสตรีมสิ่งเดียวที่เขียนคือ ID ไม่ใช่วัตถุจริง
สตรีมอินพุตทำสิ่งเดียวกันในสิ่งที่ตรงกันข้าม: สำหรับแต่ละวัตถุที่อ่านจากสตรีมนั้นจะกำหนดหมายเลข ID โดยใช้อัลกอริทึมเดียวกับสตรีมเอาต์พุตและหมายเลข ID นั้นจะอ้างอิงอินสแตนซ์ของวัตถุในแผนที่ เมื่อเห็นวัตถุที่ถูกทำให้เป็นอนุกรมโดยใช้ ID มันจะดึงอินสแตนซ์ดั้งเดิมออกจากแผนที่
นี่คือวิธีที่เอกสาร APIอธิบาย:
การอ้างอิงหลายรายการไปยังวัตถุเดียวถูกเข้ารหัสโดยใช้กลไกการแบ่งปันอ้างอิงเพื่อให้กราฟของวัตถุสามารถคืนค่าเป็นรูปร่างเดียวกับเมื่อต้นฉบับถูกเขียน
พฤติกรรมนี้อาจทำให้เกิดปัญหา: เนื่องจากสตรีมมีการอ้างอิงอย่างหนักกับแต่ละวัตถุ (เพื่อให้รู้ว่าเมื่อใดที่จะแทนที่ ID) คุณสามารถเรียกใช้หน่วยความจำไม่เพียงพอหากคุณเขียนวัตถุชั่วคราวจำนวนมากไปยังสตรีม reset()
คุณแก้ปัญหาว่าด้วยการโทร