जावा उन वस्तुओं पर नज़र रखता है जिन्हें धारा में लिखा गया है, और बाद के उदाहरणों को एक आईडी के रूप में लिखा गया है, न कि वास्तविक अनुक्रमित वस्तु।
इसलिए, आपके उदाहरण के लिए, यदि आप स्ट्रीम के लिए "a" उदाहरण लिखते हैं, तो स्ट्रीम उस ऑब्जेक्ट को एक अद्वितीय आईडी देता है (चलो "1" कहते हैं)। "ए" के क्रमांकन के भाग के रूप में, आपको "बी" को क्रमबद्ध करना होगा, और धारा इसे एक और आईडी ("2") देती है। यदि आप तब स्ट्रीम में "b" लिखते हैं, तो केवल एक चीज जो लिखी जाती है वह है ID, वास्तविक वस्तु नहीं।
इनपुट स्ट्रीम रिवर्स में एक ही काम करती है: प्रत्येक ऑब्जेक्ट के लिए जिसे वह स्ट्रीम से पढ़ता है, यह आउटपुट स्ट्रीम के समान एल्गोरिथ्म का उपयोग करके एक आईडी नंबर प्रदान करता है, और यह आईडी नंबर मैप में ऑब्जेक्ट उदाहरण को संदर्भित करता है। जब यह एक वस्तु को देखता है जिसे एक आईडी का उपयोग करके अनुक्रमित किया गया था, तो यह नक्शे से मूल उदाहरण को पुनः प्राप्त करता है।
इस तरह एपीआई डॉक्स इसका वर्णन करते हैं:
किसी एकल ऑब्जेक्ट के एकाधिक संदर्भों को संदर्भ साझाकरण तंत्र का उपयोग करके एन्कोड किया गया है ताकि वस्तुओं के ग्राफ़ को उसी आकार में बहाल किया जा सके जब मूल लिखा गया था
यह व्यवहार समस्याएँ पैदा कर सकता है: क्योंकि स्ट्रीम प्रत्येक ऑब्जेक्ट के लिए एक कठिन संदर्भ रखती है (ताकि यह जानता हो कि आईडी को कब बदलना है), यदि आप स्ट्रीम में बहुत अधिक क्षणिक वस्तु लिखते हैं तो आप मेमोरी से बाहर निकल सकते हैं। आप कॉल करके हल करते हैं reset()
।