Xml将多个对象类型序列化为一个列表

时间:2009-01-19 00:36:14

标签: c# serialization xml-serialization

我有一个具有抽象'aninamls'列表的对象。即。

var animals = new Animals
{
   new Bird{ TailFeatherColour = "Blue" },
   new Cat{ Colour = "Brown" }
};

使用xmlserializer,可以将上面的序列化为以下xml,

<?xml version="1.0" encoding="utf-16"?>
<Animals>
    <Bird>
        <TailFeatherColour>Blue</TailFeatherColour>
    </Bird>
    <Cat>
        <Colour>Brown</Colour>
    </Cat>
</Animals>

目前,我只能得到以下内容:

<?xml version="1.0" encoding="utf-16"?>
<Animals>
    <Animal xsi:type="Bird">
        <TailFeatherColour>Blue</TailFeatherColour>
    </Animal>
    <Animal xsi:type="Cat">
        <Colour>Brown</Colour>
    </Animal>
</Animals>

1 个答案:

答案 0 :(得分:1)

当列表是另一个类中的字段时,可以使用XmlElementAttributeXmlArrayItemAttribute属性来执行此操作(不同之处在于前者不会在列表元素周围放置容器元素,而后者确实)。

我不相信你只需要一个列表即可实现你想要的东西,即当被序列化的实际对象是一个列表时(虽然我可能在这里错了)但是你可以通过在类中嵌套一个列表来伪造它,例如

[XmlRoot("Animals")]
[XmlType("Animals")]
public class AnimalsWrapper
{
    [XmlElement(typeof(Bird), ElementName = "Bird")]
    [XmlElement(typeof(Cat), ElementName = "Cat")]
    public List<Animal> Animals;
}

这是一个笨拙的黑客攻击,但会序列化到您正在寻找的内容。