2010-06-27 10 views
20

मैं वस्तुओं List<TestObject> की सूची serializing कर रहा हूँ की सूची serializing के बाद उत्पन्न नाम बदलने के लिए, और XmlSerializer उत्पन्न <ArrayOfTestObject> विशेषता है, मैं यह नाम बदलने या इसे हटाने चाहते हैं।
क्या यह नई कक्षा बनाने के साथ किया जा सकता है जो क्षेत्र के रूप में सूची को समाहित करता है?कैसे <ArrayOf> XML विशेषता है कि वस्तुओं

[XmlRoot("myOuterElement")] 
public class MyOuterMessage { 
    [XmlElement("item")] 
    public List<TestObject> Items {get;set;} 
} 

और क्रमानुसार कि (अर्थात किसी अन्य वस्तु में अपनी सूची में डाल दिया):

[XmlRoot("Container")]  
public class TestObject 
{ 
    public TestObject() { }       
    public string Str { get; set; }       
} 

List<TestObject> tmpList = new List<TestObject>(); 

TestObject TestObj = new TestObject(); 
TestObj.Str = "Test"; 

TestObject TestObj2 = new TestObject(); 
TestObj2.Str = "xcvxc"; 

tmpList.Add(TestObj); 
tmpList.Add(TestObj2); 


XmlWriterSettings settings = new XmlWriterSettings(); 
settings.OmitXmlDeclaration = true; 
settings.Indent = true; 
XmlSerializer serializer = new XmlSerializer(typeof(List<TestObject>)); 

using (XmlWriter writer = XmlWriter.Create(@"C:\test.xml", settings)) 
{    
    XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(); 
    namespaces.Add(string.Empty, string.Empty); 
    serializer.Serialize(writer, tmpList, namespaces);        
} 


<ArrayOfTestObject> 
    <TestObject> 
    <Str>Test</Str> 
    </TestObject> 
    <TestObject> 
    <Str>xcvxc</Str> 
    </TestObject> 
</ArrayOfTestObject> 
+0

अद्यतन पुनः टिप्पणी –

उत्तर

24

सबसे विश्वसनीय तरीका एक सबसे बाहरी डीटीओ वर्ग घोषित करने के लिए है।


आप एक आवरण वर्ग से बच सकते हैं, लेकिन मैं नहीं होगा:

class Program 
{ 
    static void Main() 
    { 
     XmlSerializer ser = new XmlSerializer(typeof(List<Foo>), 
      new XmlRootAttribute("Flibble")); 
     List<Foo> foos = new List<Foo> { 
      new Foo {Bar = "abc"}, 
      new Foo {Bar = "def"} 
     }; 
     ser.Serialize(Console.Out, foos); 
    } 
} 

public class Foo 
{ 
    public string Bar { get; set; } 
} 

समस्या इस के साथ कि जब आप कस्टम विशेषताओं का उपयोग आप बहुत सावधान रहने की जरूरत है धारावाहिक को स्टोर और पुन: उपयोग करने के लिए, अन्यथा आपको मेमोरी में लोड गतिशील असेंबली के लॉट मिलते हैं। यदि आप केवल XmlSerializer(Type) कन्स्ट्रक्टर का उपयोग करते हैं, तो इससे बचा जाता है, क्योंकि यह आंतरिक रूप से स्वचालित रूप से कैश करता है।

+0

मार्क ने सिर पर नाखून मारा। मैंने http://stackoverflow.com/questions/3000934/return-xml-data-from-a-web-service/3001176#3001176 –

+0

पर एक समान चाल की है तो किसी अन्य वर्ग का उपयोग करने से बचने का कोई तरीका नहीं है? – ilann

+0

एक बेहतर और आसान तरीका है, बस इस सवाल से: http://stackoverflow.com/questions/1237683/xml-serialization-of-listt-xml-root – Fedearne

0

अन्य वर्ग की तरह बनाएं:

 [XmlRoot("TestObjects")] 
     public class TestObjects: List<TestObject> 
     { 

     } 

तो नीचे दिए गए कोड को लागू करने, जबकि sealizing:

  XmlSerializer serializer = new XmlSerializer(typeof(TestObjects)); 
      MemoryStream memStream = new MemoryStream(); 
      serializer.Serialize(memStream, tmpList); 
+0

इसका मेरे मामले में कोई प्रभाव नहीं पड़ा। मैं _guess_ अंतर्निहित सीरियलाइज़र बस देखता हूं कि धारावाहिक करने का ऑब्जेक्ट अपनी विशेष नामकरण योजना लागू करने के लिए 'सूची' का एक बच्चा है। –

4

बदलें से निम्न पंक्ति:

XmlSerializer serializer = new XmlSerializer(typeof(List<TestObject>)); 

करने के लिए:

XmlRootAttribute root = new XmlRootAttribute("TestObjects");  

XmlSerializer serializer = new XmlSerializer(typeof(List<TestObject>), root); 

यह काम करना चाहिए।

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