2010-01-08 14 views
8

मेरे भंडार है List<Student>, List<Course> और List<Enrolment> जहां एक नामांकन Enrolment.Student और Enrolment.Course जो संदर्भ छात्रों या पिछले दो सूचियों में पाठ्यक्रमों में से एक हैं।नेट XmlSerializer और कई एक ही वस्तु के लिए संदर्भ

जब मैं अपने भंडार पर XmlSerializer का उपयोग यह अनावश्यक डेटा आउटपुट के रूप में यह List<Enrolment> में उन्हीं छात्रों के लिए हर संदर्भ के लिए तो फिर List<Student> में प्रत्येक छात्र के सभी गुण serializes। मैं इसे हल करने के लिए एक शानदार तरीका ढूंढ रहा हूं।

अक्रमांकन बाद मैं अक्रमांकन द्वारा बनाई गई नकली वस्तु उदाहरणों में आईडी मानों का उपयोग संदर्भ ठीक कर सकते हैं, लेकिन यह hackish लगता है।

अनावश्यक आउटपुट को ठीक करने का एक तरीका XmlIgnore Enrolment.Student और Enrolment.Course और serialization के लिए दो और गुण बनाएं - Enrolment.StudentID और Enrolment.CourseID। हालांकि deserialization के दौरान, List<Student> और List<Course> के deserialization के परिणाम के बाद से Enrolment.Student और Enrolment.Course के लिए संदर्भ सेट नहीं किए जा सकते हैं (AFAIK)।

एक और तरीका जिस बारे में मैंने सोचा था, मेरी ऑब्जेक्ट पदानुक्रम में अलग-अलग क्रमशः क्रमशः मेरी प्रत्येक सूची को अलग-अलग करने और deserialization के क्रम को नियंत्रित करने के लिए है - मैं यह नहीं करता।

एक और तरीका XmlIgnore List<Enrolment> और एक नामांकन क्रमबद्धता सहायक वर्ग बनाना होगा जो List<Enrolment> प्रारंभ होता है, जो स्वयं के विलुप्त होने के बाद पूरा हो जाता है। यह बहुत प्रयास की तरह लगता है।

अन्य लोगों को कैसे को क्रमानुसार/एक ही वस्तु XmlSerializer का उपयोग करने के कई संदर्भ deserialize करते हैं?

उत्तर

3

ओह क्रमबद्धता का दर्द: -> ...

इस के लिए एक सामान्य समाधान कभी नहीं था, मुझे लगता है कि यही कारण है कि एमएस यह सिल्वरलाइट ढांचे से बाहर छीन लिया है।

मैं .NET Framework के किसी भी स्वत: सीरियलाइज़ेष्ण तंत्र पर भरोसा करते हैं कभी नहीं। मेरे अपने मॉडल और रिपॉजिटरीज़ के लिए, मैं आमतौर पर प्रोग्रामेटिक रूप से जानता हूं कि कौन से गुण सरल स्केलर वाले हैं (संख्याएं/तार/आदि) और जो अन्य ऑब्जेक्ट्स के लिंक हैं (साथ ही साथ दोनों की सूचियां भी हैं)।

1:

मूल रूप से 2 परिदृश्य हैं हम क्रमानुसार करने/स्थानांतरण वस्तुओं की ही फ्लैट जानकारी चाहते हैं। उस स्थिति में मैं अन्य वस्तुओं से लिंक करने वाले गुणों के लिए केवल संबंधित आईडी स्थानांतरित करता हूं। रिसीवर तब अन्य सभी ऑब्जेक्ट्स प्राप्त करने के लिए बाद के प्रश्न बना सकता है।

2: हम जितना संभव हो उतना अधिक जानकारी स्थानांतरित करना चाहते हैं, यानी कई स्तरों के साथ गहरा घोंसला वाला एक्सएमएल, ज्यादातर कुछ रिपोर्टिंग कार्यक्षमता के लिए जो कुछ भी सीधे एक्सएमएल पर कुछ सीएसएस का उपयोग करके प्रदर्शित करता है। उस स्थिति में, यह वास्तव में वांछित है कि वस्तुओं को एक ही समय में एक्सएमएल पेड़ में हल किया जाएगा।

कभी-कभी मुझे बाद में कई प्रश्न पूछने के लिए पहले परिदृश्य को ट्विक करने की आवश्यकता होती है, लेकिन आम तौर पर मैं बहुत अच्छी तरह से मिलता हूं। अर्थात। मैंने अपने कोड बेस में बनाया है कि हम निर्दिष्ट कर सकते हैं कि कौन सी अतिरिक्त ऑब्जेक्ट्स हम हल करना चाहते हैं, और/या यह कहीं कॉन्फ़िगर किया गया है।

+0

बहुत आश्वस्त - इस के लिए नया होने के नाते मुझे लगता है कि मुझे कुछ याद आना चाहिए। चूंकि मेरी समस्या आपके पहले परिदृश्य से संबंधित है, इसलिए मैं deserialization को साफ करने के लिए कोड बेस में कुछ बनाने के आपके सुझाव का पालन करूंगा। हो सकता है कि मैं एक IXmlFinalizeDeserialization बनाउंगा जिसे मेरी सभी वस्तुओं में बुलाया जा सकता है, जिनके deserialization अपर्याप्त है और संदर्भ को ठीक करता है। –

2

XML सीरिएलाइज़र का उपयोग करके इस समस्या का कोई समाधान नहीं है। इसमें पहचान की अवधारणा नहीं है जिसका उपयोग डुप्लिकेशन को हटाने के लिए किया जा सकता है।

सबसे अच्छा आप कर सकते हैं उनके संदर्भ से अलग वस्तुओं के पूल को क्रमानुसार करने है। फिर आप deserialization के बाद अपनी सूचियों को फिर से बना सकते हैं।

Btw, आप जानते हैं कि XmlSerializer सी # के लिए विशिष्ट नहीं है?

+0

धन्यवाद जॉन - बहुत संक्षिप्त। मैंने अपने टैग से सी # हटा दिया है। –

2

आप नामांकन के लिए और WriteXml विधि में छात्र और पाठ्यक्रम एक्सएमएल जो केवल चाबियाँ, उदा, शामिल होगा .:

<Student Id="5"/> 
<Course Id="6"/> 

और ReadXml विधि में आप इस से संदर्भ लोड कर सकते हैं उत्पन्न इंटरफ़ेस IXmlSerializable लागू कर सकते हैं। आपको छात्र और पाठ्यक्रम संपत्ति में XmlIgnore विशेषता भी सेट करनी होगी।

+0

इस दृष्टिकोण के साथ समस्या यह है कि रीडएक्सएमएल के दौरान आप संदर्भों को लोड नहीं कर सकते हैं (AFAIK) अन्य डेटा को भी deserialized किया जा रहा है क्योंकि यह deserialization पूरा होने तक अनुपलब्ध है। क्या आप इस बारे में कुछ जानते हैं? –

0

कैसे एक समाधान के रूप इस ध्वनि:

  1. XMLIgnore प्रत्येक माध्यमिक संदर्भ यानी Enrolment.Student & Enrolment.Course
  2. कि क्रमानुसार करने प्रयोग किया जाता है प्रत्येक माध्यमिक संदर्भ के लिए एक संपत्ति बनाने/इसके संदर्भ में एक विदेशी कुंजी को deserialize - XML_FK के साथ उपसर्ग । जैसे XML_FK_Student & XML_FK_Course
  3. एक विधि XML_FinalizeDeserialization जाता है कि अक्रमांकन के बाद कहा जाता है उन विदेशी कुंजी गुणों का उपयोग करके संदर्भ लोड करने के लिए बनाएँ।
+1

क्या यह अच्छा नहीं होगा अगर हम एक विशेषता [XmlSecondary] बना सकते हैं जो हमने एक संदर्भ से आगे रखा है जो XML_Serializer को [XMLPK] के साथ उपसर्ग वाले फ़ील्ड के संदर्भ का निरीक्षण करने का कारण बनता है और केवल उनको आउटपुट करता है? मुमकिन? –

+0

काफी संभव है, लेकिन आपको विशेषता को पहचानने के लिए अपना खुद का धारावाहिक लिखना होगा, और मुझे लगता है कि आप ऐसा नहीं करना चाहते हैं। –

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