2011-02-02 10 views
5

मैं एक struct कम या ज्यादा इस तरह है:मैं सी # में सूची <SomeStruct>() में प्रत्येक सूची आइटम के क्रमबद्ध नाम को ओवरराइड कैसे कर सकता हूं?

[Serializable] 
[XmlRoot("Customer")] 
public struct TCustomer 
{ 
    string CustomerNo; 
    string Name; 
} 

मैं कभी कभी एक भी वस्तु है, जो ठीक काम करता है के रूप में एक्सएमएल को यह इस struct को क्रमानुसार, लेकिन मैं भी कभी कभी इस struct की एक सूची <> क्रमानुसार करने की जरूरत है ।

मैं इस का उपयोग किया है उच्च स्तर घटक नाम सेट करने:

[Serializable] 
[XmlRoot("Customers")] 
public class CustomerList : List<TCustomer> { } 

XmlSerializer हालांकि, प्रत्येक सूची आइटम TCustomer बुला पर जोर देता है। मैं XmlSerializer को TCustomer के बजाय ग्राहक नाम का उपयोग करने के लिए कैसे कह सकता हूं?

उत्तर

2

सभी उत्तरों के लिए धन्यवाद। हालांकि, मेरी विशिष्ट समस्या के लिए सोलाइशन उतना सरल हो गया:

[XmlRoot("Customers")] 
public class Customers 
{ 
    [XmlElement("Customer")] 
    public List<TCustomer> List = new List<TCustomer>(); 
} 
+0

की आवश्यकता है जो मैं ढूंढ रहा था! धन्यवाद! – Sergey

1

मैंने कक्षा/संरचना स्तर पर कभी कोशिश नहीं की है, लेकिन इस तरह मैं कक्षा में एक सूची को क्रमबद्ध करने की आवश्यकता होने पर ऐसा करता हूं।

[XmlArray("ConfigurationList")] 
    [XmlArrayItem("Configuration")] 
    private List<string> pConfigList = new List<string>(); 
0

आप जिस तरह से किसी वस्तु धारावाहिक है कस्टमाइज़ करने के लिए IXmlSerializable लागू कर सकते हैं:

IXmlSerializable Interface

वैसे भी, यह कि serializer TCustomer आइटम के प्रकार कहता है, क्योंकि इस के वास्तविक प्रकार है लगता है List (TCustomer ??? है, जहां ??? सामान्य पैरामीटर प्रकार TCustomer का वास्तविक प्रकार होगा)।

मैं जिस तरह से XmlSerializerIXmlSerializable को लागू करने के बिना वस्तुओं को धारावाहिक में परिवर्तन नहीं होगा (मेरा मतलब है, एक के बाद serializing पाठ प्रतिस्थापन या जो कुछ भी से बचने के!)।

7

आशा है कि यह मदद करता है

[XmlType("Customer")] 
[XmlRoot("Customer")] 
public struct TCustomer 
{ 
    public string CustomerNo; 
    public string Name; 
} 
+0

अच्छा! यह अच्छा होगा अगर आप समझा सकते हैं, यद्यपि? –

+0

XML स्कीमा को नियंत्रित करता है जो उत्पन्न होता है जब विशेषता लक्ष्य XmlSerializer द्वारा क्रमबद्ध किया जाता है। - http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmltypeattribute.aspx – Anuraj

+0

यह अधिक उचित है - XmlTypeAttribute क्लास का एक नया उदाहरण आरंभ करता है और XML प्रकार का नाम निर्दिष्ट करता है। - http://msdn.microsoft.com/en-us/library/573s2dsz.aspx – Anuraj

5

XmlRoot विशेषता केवल मूल तत्व के लिए लागू होता है, तो यह TCustomer के लिए लागू नहीं होता है जब आप CustomerList serializing कर रहे हैं।

अपनी खुद की क्रमबद्धता को लागू करने के बिना, मुझे नहीं लगता कि आप TCustomer बदल सकते हैं CustomerList वर्ग के भीतर Customer के रूप में क्रमानुसार करने है। लेकिन आप कुछ इस तरह कर सकते हैं ...

[Serializable] 
[XmlRoot("customerList")] 
public class CustomerList 
{ 
    [XmlArray("customers")] 
    [XmlArrayItem("customer")] 
    public List<TCustomer> Customers { get; set; } 
} 

कि देना चाहिए आप के लिए इसी तरह एक्सएमएल:

<customerList> 
    <customers> 
     <customer /> 
     <customer /> 
     <customer /> 
    </customers> 
</customerList> 

यह एक सामान्य सूची में से अपने CustomerList बदल जाता है, लेकिन यह है कि आप अपने नामकरण नियंत्रित करने के लिए अनुमति देता है।

+0

में उपयोग किए जाने वाले नाम को नियंत्रित करने के लिए XmlType का उपयोग कर सकते हैं। मैंने अभी तक ऐसा कोई मामला नहीं देखा है जहां स्वीकृत उत्तर मानक प्रकारों के लिए आइटम नामों को क्रमबद्ध करने के लिए भी काम करता है 'सूची माईलिस्ट' की तरह, यह उत्तर हालांकि उस विशेष मामले में बाल टैग नामों का नाम बदलने के लिए पर्याप्त लचीला है। इसके अलावा यदि आपको केवल सूची तत्व टैग का नाम बदलने की आवश्यकता है, तो मैंने देखा है कि केवल '[XmlArrayItem ("ग्राहक")] 'वास्तव में – Henrik

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

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