2010-06-27 51 views
20

我序列化对象List<TestObject> 的名单列表后生成 XML属性,XmlSerializer的生成 <ArrayOfTestObject>属性,我想重新命名或删除它。
可以通过创建封装List作为字段的新类来完成吗?
如何重命名序列化对象

[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

已更新的评论 – 2010-06-28 08:11:18

回答

24

最可靠的方法是声明的最外面的DTO类:

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

和序列化(即把你的名单到另一个对象)。


可以避免包装类,但我不会:

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

Marc撞在了头上。我做了一个类似的技巧在http://stackoverflow.com/questions/3000934/return-xml-data-from-a-web-service/3001176#3001176 – 2010-06-27 23:20:37

+0

所以有没有办法避免使用另一个类? – ilann 2010-06-28 06:59:23

+0

有一个更好更简单的方法,只是这个问题:http://stackoverflow.com/questions/1237683/xml-serialization-of-listt-xml-root – Fedearne 2011-06-09 11:11:24

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_内置的序列化程序只是查看序列化的对象是否是'List'的子元素,以便应用其特殊的命名方案。 – 2017-09-17 20:38:06

4

更改以下行从:

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

要:

XmlRootAttribute root = new XmlRootAttribute("TestObjects");  

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

它应该工作。