XMLSerializer将集合中的项大写
本文关键字:集合 XMLSerializer | 更新日期: 2023-09-27 17:50:38
我需要导出驼峰格式的项目集合,为此我使用了包装器。
类本身:
[XmlRoot("example")]
public class Example
{
[XmlElement("exampleText")]
public string ExampleText { get; set; }
}
这个序列化很好:
<example>
<exampleText>Some text</exampleText>
</example>
包装:
[XmlRoot("examples")]
public class ExampleWrapper : ICollection<Example>
{
[XmlElement("example")]
public List<Example> innerList;
//Implementation of ICollection using innerList
}
然而,由于某种原因,这大写了包装的Example
s,我试图用XmlElement
覆盖它,但这似乎没有达到预期的效果:
<examples>
<Example>
<exampleText>Some text</exampleText>
</Example>
<Example>
<exampleText>Another text</exampleText>
</Example>
</examples>
谁能告诉我我做错了什么,或者是否有更简单的方法?
问题是XmlSerializer
有内置的处理集合类型,这意味着它会忽略所有的属性和字段(包括innerList
),如果你的类型碰巧实现ICollection
,将只是序列化它根据自己的规则。但是,您可以使用XmlType
属性(与您在示例中使用的XmlRoot
相反)自定义它用于集合项的元素名称:
[XmlType("example")]
public class Example
{
[XmlElement("exampleText")]
public string ExampleText { get; set; }
}
将具有所需的序列化。
参见http://msdn.microsoft.com/en-us/library/ms950721.aspx,具体回答"为什么集合类的所有属性不是序列化的?"
不幸的是,您不能仅使用属性来实现这一点。您还需要使用属性覆盖。使用上面的类,我可以使用XmlTypeAttribute
来覆盖类的字符串表示。
var wrapper = new ExampleWrapper();
var textes = new[] { "Hello, Curtis", "Good-bye, Curtis" };
foreach(var s in textes)
{
wrapper.Add(new Example { ExampleText = s });
}
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes attributes = new XmlAttributes();
XmlTypeAttribute typeAttr = new XmlTypeAttribute();
typeAttr.TypeName = "example";
attributes.XmlType = typeAttr;
overrides.Add(typeof(Example), attributes);
XmlSerializer serializer = new XmlSerializer(typeof(ExampleWrapper), overrides);
using(System.IO.StringWriter writer = new System.IO.StringWriter())
{
serializer.Serialize(writer, wrapper);
Console.WriteLine(writer.GetStringBuilder().ToString());
}
这给
<examples>
<example>
<exampleText>Hello, Curtis</exampleText>
</example>
<example>
<exampleText>Good-bye, Curtis</exampleText>
</example>
</examples>
我相信这是你想要的。
[xmlType("DISPLAY_NAME")]正在为集合中的xml序列化中的内部对象命名工作
[XmlType("SUBSCRIPTION")]
public class Subscription
{