2009-05-18 12 views
37

को क्रमबद्ध कैसे कर सकता हूं मैं हाल ही में क्रमबद्धता के बारे में पढ़ रहा हूं। मैंने पढ़ा है कि जब मैं XmlSerialization का उपयोग करता हूं तो मैं ऑब्जेक्ट ग्राफ़ को क्रमबद्ध नहीं कर सकता। ऑब्जेक्ट ग्राफ़ क्या है और मैं इसे आसानी से क्यों क्रमबद्ध नहीं कर सकता?ऑब्जेक्ट ग्राफ़ क्या है और मैं एक

उत्तर

50

एक वस्तु ग्राफ एक वस्तु नहीं है, बल्कि संबंधित वस्तुओं का एक सेट है। एक साधारण उदाहरण के लिए, पर विचार करें:

public class Node { 
    public string Name {...} 
    public Node Parent {...} 
    public List<Node> Children {...} 
} 

जहां प्रत्येक बच्चे माता-पिता के बारे में जानता (और माता पिता के बच्चे के बारे में जानता है)।

समस्या

उस xml वस्तु गुणों के आधार पर एक पेड़ है ... और यह सिर्फ उन्हें चलने के लिए चाहता है - सरल माता पिता/बच्चे के साथ अर्थात्:

  • ए (कोई जानता है कि बी अपने बच्चे को है)
    • बी (कोई जानता है कि एक अपनी मूल है)

कि के रूप में क्रमानुसार होगा:

<Node> 
    <Name>A</Name> 
    <!-- no Parent as A is the top node, so null --> 
    <Children> 
    <Node> 
     <Name>B</Name> 
     <Parent> 
      <Node> 
       <Name>A</Name> 
       *** boom *** 

आप देख सकते हैं कि हम ए पर वापस आ गए हैं, इसलिए अब हम अंतहीन पाश में हैं।

XmlSerializer डेटा के पेड़ क्रमबद्ध कर सकते हैं, लेकिन पूर्ण ग्राफ नहीं। आप चिह्नित कर सकते हैं गुण उदाहरण के लिए, पर ध्यान नहीं दिया जा सकता:

[XmlIgnore] 
public Node Parent {...} 

और अब यह काम करेंगे, लेकिन हम बाद में Parent को ठीक करना होगा।

इसके विपरीत, कुछ अन्य धारावाहिक ग्राफ (DataContractSerializer ऑन-डिमांड) को संभाल सकते हैं। यह एक अद्वितीय कुंजी के खिलाफ ऑब्जेक्ट्स को ट्रैक करके करता है - लेकिन फिर आउटपुट नियमित xml से अपेक्षा नहीं करता है।

9

एक ऑब्जेक्ट ग्राफ़ ऑब्जेक्ट्स का एक सेट है जो एक दूसरे का संदर्भ देता है।

किसी ऑब्जेक्ट ग्राफ़ को क्रमबद्ध करना मुश्किल है। धारावाहिक को प्रत्येक ऑब्जेक्ट को एक अद्वितीय आईडी असाइन करना होगा और फिर अद्वितीय आईडी के साथ संदर्भों को प्रतिस्थापित करना होगा।

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

सबसे आसान समाधान इसका समर्थन नहीं करना है।

.NET बाइनरी धारावाहिक प्रदान करता है जो इस मुद्दे के साथ-साथ परिपत्र संदर्भों के मुद्दे से संबंधित है।

5

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

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