अगर हम दो वस्तुओं को एक दूसरे के संदर्भ में अनुक्रमित और डिस्क्रिअलाइज़ करते हैं तो क्या होता है?


15

इसे और अधिक स्पष्ट करने के लिए, यह एक त्वरित उदाहरण है:

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;

तो क्या होता है अगर हम एक ए और बी ऑब्जेक्ट को एक फ़ाइल में क्रमबद्ध करते हैं और उस फ़ाइल से डिस्क्रिअलाइज़ करते हैं?

मुझे लगा कि हमें प्रत्येक की 4 वस्तुएं, 2 मिलेंगी। समान वस्तुएं लेकिन विभिन्न उदाहरण।

लेकिन मुझे यकीन नहीं है कि कुछ और है या यह सही है या गलत है।

अगर किसी भी तकनीक का जवाब देने की जरूरत है, तो कृपया जावा पर आधारित सोचें।

धन्यवाद।

जवाबों:


25

जावा उन वस्तुओं पर नज़र रखता है जिन्हें धारा में लिखा गया है, और बाद के उदाहरणों को एक आईडी के रूप में लिखा गया है, न कि वास्तविक अनुक्रमित वस्तु।

इसलिए, आपके उदाहरण के लिए, यदि आप स्ट्रीम के लिए "a" उदाहरण लिखते हैं, तो स्ट्रीम उस ऑब्जेक्ट को एक अद्वितीय आईडी देता है (चलो "1" कहते हैं)। "ए" के क्रमांकन के भाग के रूप में, आपको "बी" को क्रमबद्ध करना होगा, और धारा इसे एक और आईडी ("2") देती है। यदि आप तब स्ट्रीम में "b" लिखते हैं, तो केवल एक चीज जो लिखी जाती है वह है ID, वास्तविक वस्तु नहीं।

इनपुट स्ट्रीम रिवर्स में एक ही काम करती है: प्रत्येक ऑब्जेक्ट के लिए जिसे वह स्ट्रीम से पढ़ता है, यह आउटपुट स्ट्रीम के समान एल्गोरिथ्म का उपयोग करके एक आईडी नंबर प्रदान करता है, और यह आईडी नंबर मैप में ऑब्जेक्ट उदाहरण को संदर्भित करता है। जब यह एक वस्तु को देखता है जिसे एक आईडी का उपयोग करके अनुक्रमित किया गया था, तो यह नक्शे से मूल उदाहरण को पुनः प्राप्त करता है।

इस तरह एपीआई डॉक्स इसका वर्णन करते हैं:

किसी एकल ऑब्जेक्ट के एकाधिक संदर्भों को संदर्भ साझाकरण तंत्र का उपयोग करके एन्कोड किया गया है ताकि वस्तुओं के ग्राफ़ को उसी आकार में बहाल किया जा सके जब मूल लिखा गया था

यह व्यवहार समस्याएँ पैदा कर सकता है: क्योंकि स्ट्रीम प्रत्येक ऑब्जेक्ट के लिए एक कठिन संदर्भ रखती है (ताकि यह जानता हो कि आईडी को कब बदलना है), यदि आप स्ट्रीम में बहुत अधिक क्षणिक वस्तु लिखते हैं तो आप मेमोरी से बाहर निकल सकते हैं। आप कॉल करके हल करते हैं reset()


तो यह विघटन के बाद मूल स्थिति में वापस आ जाएगा, है ना? जैसा कि यह एक दूसरे के संदर्भों के साथ क्रमांकन से पहले है?
सेरेग्वेथ्रिन

1
हां, आप केवल 2 ऑब्जेक्ट्स का अंत करते हैं, एक दूसरे का संदर्भ लेते हैं।
हेट्रक्ट

1
मुझे विश्वास नहीं होता कि जावा अपने आप इसे संभालता है। मैं प्रभावित हूँ
Cruncher

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.