7

我需要在驼色外壳中导出一组物品,为此我使用了一个包装器。

类本身:

[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>

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

4

2 回答 2

5

问题是它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,特别是对“为什么不是集合类的所有属性都序列化?”问题的答案。

于 2013-01-03T16:51:31.063 回答
0

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

我相信你想要的。

于 2013-01-03T17:07:12.897 回答