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将集合中的项大写

问题是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
    {