C# XMLSerializer不断将集合中的项大写

C# XMLSerializer不断将集合中的项大写,c#,collections,xml-serialization,wrapper,camelcasing,C#,Collections,Xml Serialization,Wrapper,Camelcasing,我需要导出骆驼壳中的项目集合,为此我使用包装器 课程本身: [XmlRoot("example")] public class Example { [XmlElement("exampleText")] public string ExampleText { get; set; } } 这是很好的: <example> <exampleText>Some text</exampleText> </example> 谁能告

我需要导出骆驼壳中的项目集合,为此我使用包装器

课程本身:

[XmlRoot("example")]
public class Example
{
    [XmlElement("exampleText")]
    public string ExampleText { get; set; }
}
这是很好的:

<example>
    <exampleText>Some text</exampleText>
</example>

谁能告诉我我做错了什么,或者是否有更简单的方法?

问题在于
XmlSerializer
内置了对集合类型的处理,这意味着它将忽略所有属性和字段(包括
innerList
)如果您的类型碰巧实现了
ICollection
,并将根据自己的规则对其进行序列化。但是,您可以使用
XmlType
属性自定义它用于集合项的元素的名称(与您在示例中使用的
XmlRoot
相反):

将具有所需的序列化


具体请参见“为什么集合类的所有属性都没有序列化?”问题的答案。

不幸的是,您不能仅使用属性来实现这一点。您还需要使用属性覆盖。使用上面的类,我可以使用
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>

你好,柯蒂斯
再见,柯蒂斯

我相信这是您想要的。

您可以随时将
示例
类型重命名为
示例
,作为解决方法。。。如果你能坚持打破惯例……你是对的,先生!谢谢我放弃了
ICollection
的实现,转而从
List
继承。似乎不需要
XmlRoot
,对吗?正确,
XmlRoot
仅在
示例中作为序列化对象图的根时才需要。
[XmlType("example")]
public class Example
{
    [XmlElement("exampleText")]
    public string ExampleText { get; set; }
}
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>