如何重命名序列化对象列表后生成的 XML属性

我正在序列化列表对象List ,XmlSerializer生成属性,我想重命名或删除它。
可以通过创建将List封装为字段的新类来完成吗?

  [XmlRoot("Container")] public class TestObject { public TestObject() { } public string Str { get; set; } } List tmpList = new List(); 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)); using (XmlWriter writer = XmlWriter.Create(@"C:\test.xml", settings)) { XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(); namespaces.Add(string.Empty, string.Empty); serializer.Serialize(writer, tmpList, namespaces); }   Test   xcvxc   

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

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

并序列化( 即将您的列表放入另一个对象)。


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

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

这样做的问题是,当您使用自定义属性时,您需要非常小心地存储和重用串行器,否则会将大量动态程序集加载到内存中。 如果您只使用XmlSerializer(Type)构造函数,则可以避免这种情况,因为它会自动在内部缓存它。

更改以下行:

 XmlSerializer serializer = new XmlSerializer(typeof(List)); 

至:

 XmlRootAttribute root = new XmlRootAttribute("TestObjects"); XmlSerializer serializer = new XmlSerializer(typeof(List), root); 

它应该工作。

创建另一个类,如:

  [XmlRoot("TestObjects")] public class TestObjects: List { } 

然后在密封时应用以下代码:

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