2

抽象的な「動物」のリストを持つオブジェクトがあります。すなわち

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

1 に答える 1

1

リストが別のクラスのフィールドである場合、XmlElementAttributeおよびXmlArrayItemAttribute属性を使用してこれを行うことができます (前者はリスト要素の周りにコンテナー要素を配置しないのに対し、後者は配置するという違いがあります)。

リストだけで目的を達成できるとは思えません。つまり、シリアル化される実際のオブジェクトがリストの場合 (ここでは間違っている可能性があります)、クラス内にリストをネストすることでそれを偽造できます。

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

少し不格好なハックですが、探しているものにシリアル化されます。

于 2009-01-19T00:47:41.567 に答える