2010-02-14 4 views
5

मैं सी # में एक काफी छोटी कक्षा संरचना में एक्सएमएल क्रमबद्धता जोड़ने की कोशिश कर रहा हूं। मूलतः, वहाँ एक रूट वर्ग (यह Aclass कहते हैं), जो कुछ अन्य वर्ग के कई उदाहरण की एक सूची रखती का एक उदाहरण है (यह AnotherClass कहते हैं):आंतरिक संशोधक के साथ घोषित कक्षाओं की धारावाहिक सूची <>?

[XmlRoot("RootNode")] 
public class AClass { 
    [XmlElement("ListNode")] 
    internal List otherObjects { get; set; } 
} 

public class AnotherClass { 
    [XmlAttribute("Name")] 
    internal string name { get; set; } 
}

जब serializing, मैं इन दोनों के लिए करना चाहते हैं कक्षाओं को एक साथ क्रमबद्ध करने के लिए - यानी, अगर मैं एसीलास को क्रमबद्ध करता हूं, तो इसकी अन्य सूची की सूची भी क्रमबद्ध हो जाती है (this question देखें)।

मैं यह ज्यादातर काम कर रहा है, लेकिन समस्या यह है कि क्रमांकन के दौरान, XmlSerializer केवल वर्ग के public गुण के साथ सौदा करना चाहते हैं लगता है - यह AnotherClass को क्रमानुसार नहीं है सब पर अगर सूची internal घोषित किया जाता है।

मैं विधानसभा के internals serializer को दिखाई बनाने की कोशिश की:

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Xml")]

कि कुछ भी करने को नहीं मालूम था। क्या कोई तरीका है कि मैं XmlSerializer को उन वस्तुओं की सूचियों को क्रमबद्ध रूप से क्रमबद्ध करने के लिए प्राप्त कर सकता हूं जिन्हें आंतरिक घोषित किया गया है?

+0

प्रश्न के लिए +1 क्योंकि धारणा यह है कि संपत्तियों को सार्वजनिक होना चाहिए * क्योंकि यही हमें बताया गया है *। कभी-कभी मुझे लगता है कि हम में से कई उस बिंदु पर रुकते हैं जहां हमें बताया जाता है कि हम विकल्पों के बिना कुछ नहीं कर सकते हैं। – IAbstract

उत्तर

6

आप सही रास्ते पर हैं ... सिवाय इसके कि वास्तविक क्रमिकरण System.Xml द्वारा नहीं किया जाता है, लेकिन गतिशील रूप से जेनरेट की गई असेंबली द्वारा। आप उस असेंबली के नाम की भविष्यवाणी नहीं कर सकते (यह यादृच्छिक रूप से जेनरेट किया गया है), इसलिए आप इसे InternalsVisibleTo विशेषता में उपयोग नहीं कर सकते हैं।

एकमात्र समाधान एक्सएमएल क्रमबद्धता असेंबली को पूर्व-उत्पन्न करना है। आप XML Serializer Generator Tool (Sgen.exe) का उपयोग कर ऐसा कर सकते हैं। जेनरेटेड असेंबली का नाम "YourAssembly.XmlSerializers" होगा; वह नाम है जिसका उपयोग आपको InternalsVisibleTo विशेषता में उपयोग करना है।

+0

मुझे वह उपकरण नहीं पता था! मुझसे +1 –

+0

+1 @ थॉमस: यह जानना अच्छा है। क्या आपने अभी तक यह कोशिश की है? – IAbstract

+0

और, बीटीडब्ल्यू ... इस मामले में 'InternalsVisibleTo' विशेषता क्यों काम नहीं करेगी पर महान स्पष्टीकरण !!! – IAbstract

1

InternalsVisibleTo विशेषता जोड़ने का विचार एक अच्छा है, लेकिन मुझे लगता है कि समस्या यह है कि एक्सएमएल क्रमबद्धता कोड केवल असेंबली में सार्वजनिक प्रकारों की तलाश करता है।
मेरे ज्ञान के लिए XmlSerializer को आंतरिक प्रकारों को क्रमबद्ध या deserialize करने का कोई तरीका नहीं है, और आपको या तो प्रकारों को सार्वजनिक रूप से घोषित करना होगा या अपना स्वयं का क्रमिकरण कोड लिखना होगा।
इसके अलावा, XmlSerializer class documentation स्पष्ट रूप से बताता है कि ऑब्जेक्ट के केवल सार्वजनिक गुणों को क्रमबद्ध किया जाएगा: "एक्सएमएल सीरियलाइजेशन किसी ऑब्जेक्ट की सार्वजनिक संपत्तियों और फ़ील्ड को स्टोरेज या ट्रांसपोर्ट के लिए सीरियल प्रारूप (इस मामले में, एक्सएमएल) में परिवर्तित करने की प्रक्रिया है" तो यह वास्तव में ऐसा लगता है कि यह एक डिजाइन निर्णय है।

+0

असल में आंतरिक सदस्यों को क्रमबद्ध करना ठीक काम करता है ... (मेरा उत्तर देखें) –

+0

XmlSerializer के साथ आंतरिक प्रकारों को क्रमबद्ध करना संभव है, लेकिन उस स्थिति में आपको उस विशिष्ट प्रकार पर IXmlSerializable को लागू करके अपना स्वयं का कस्टम प्रकार धारावाहिक लिखना होगा (और प्रकार स्वयं सार्वजनिक होना चाहिए)। – Steven

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