2012-09-16 14 views
6

आइए कहें कि मेरे पास स्मृति में A की ऑब्जेक्ट्स arr है, जिनमें से प्रत्येक एक ही ऑब्जेक्ट B पर इंगित करने वाला संदर्भ फ़ील्ड है।जावा क्रमबद्धता, क्रियो और ऑब्जेक्ट ग्राफ़

उदाहरण:

A_1 A_2 A_3 ... A_N 
| | |  | 
| | V  | 
\--->\--> B <-----/ 

ध्यान दें कि ही प्रकार B की वस्तु को A अंक प्रकार की हर वस्तु में संदर्भ क्षेत्र।

अब, मैं arr सरणी को A प्रकार ObjectOutputStream पर क्रमबद्ध करता हूं। मैं फिर इस तरह से प्राप्त बाइट्स deserialize।

मुझे एक नई सरणी arr1 मिलती है।

1) सरणी arr1ही प्रकार B की वस्तु के लिए प्रकार A इस तरह है कि वे सभी बिंदु के वस्तुओं है?

2) दूसरे शब्दों में (मैं क्रमबद्धता से पहले एक ही वस्तु है, लेकिन प्रकार B का एक अनूठा नव निर्मित वस्तु मतलब यह नहीं है), बुला करता क्रमानुसार/जावा में deserialize एक ही वस्तु ग्राफ बनाए रखने के रूप में यह क्रमबद्धता से पहले था? (यानी पुराने deserialized ऑब्जेक्ट ग्राफ isomorphic पुराने है)

3) यह दस्तावेज कहां है? (यानी कृपया उद्धरण प्रदान करें)

4) वही प्रश्न 1-3, लेकिन Kryo जावा के लिए क्रमबद्धता फ्रेमवर्क पर लागू किया गया।

धन्यवाद।

उत्तर

9

http://docs.oracle.com/javase/6/docs/api/java/io/ObjectOutputStream.html

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

विनिर्देश की मेरी समझ का सवाल है, आप वस्तु संदर्भ वस्तु उदाहरणों साझा एक ही ObjectOutputStream सोचा जाना जा सकता है अगर साझा की जाती हैं।

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

मुझे खेद है, लेकिन मैं क्रियो लाइब्रेरी के अपने क्रमबद्ध तंत्र के साथ मदद नहीं कर सकता, मुझे इसका इस्तेमाल करने वाले किसी व्यक्ति से सीखने में बहुत खुशी होगी।kryo के बारे में

संपादित करें:

कुछ प्रलेखन मैंने पाया:

  • डिफ़ॉल्ट रूप से, पहले के बाद ग्राफ में एक वस्तु का प्रत्येक उपस्थिति एक पूर्णांक क्रमसूचक के रूप में जमा है। यह एक ही ऑब्जेक्ट और चक्रीय ग्राफ के एकाधिक संदर्भों को क्रमबद्ध करने की अनुमति देता है। इस भूमि के ऊपर की एक छोटी राशि है और अगर यह आवश्यक नहीं है स्थान बचाने के लिए निष्क्रिय किया जा सकता: kryo.setReferences(false);

  • This (GitHub) संदर्भ समाधानकर्ता का अनुबंध है, दो कार्यान्वयन दिए गए हैं: छोटी वस्तुओं रेखांकन के लिए ArrayList आधारित, बड़े लोगों के लिए मानचित्र आधारित

  • This डिफ़ॉल्ट वस्तु सरणी (डी) serializer के कार्यान्वयन है

  • वर्गों के लिए पंजीकृत करने की आवश्यकता (डी) क्रमबद्धता; प्रत्येक पंजीकृत वर्ग एक serializer के साथ मिलकर किया जा सकता है (, जो बीच में डिफ़ॉल्ट जावा क्रमांकन mechanism)

+0

के माध्यम से एक ही 'ObjectOutputStream', या अतिरिक्त' writeObject' विधि का एक ही मंगलाचरण के माध्यम से? – axel22

+2

बस एक ही धारा के माध्यम से; एक दूसरे के संदर्भ में दो वस्तुओं के बारे में सोचो। आप स्ट्रीम में पहले (और इस प्रकार दूसरे के संदर्भ) लिखते हैं। जब आप एक ही स्ट्रीम में दूसरा लिखते हैं, जिसमें दोनों के लिए आईडी होती है, तो संदर्भ साझा किए जाते हैं। –

+0

महान उत्तर के लिए धन्यवाद! – axel22

संबंधित मुद्दे