gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:16:39 26 4
gpt4 key购买 nike

我正在序列化对象列表 List<TestObject>, 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>

最佳答案

最可靠的方法是声明一个最外层的 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) 构造函数,就可以避免这种情况,因为它会自动在内部缓存它。

关于c# - 如何重命名序列化对象列表后生成的 <ArrayOf> XML 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3129001/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com