XmlSerialization нескольких типов объектов в одном списке - PullRequest
2 голосов
/ 19 января 2009

У меня есть объект, у которого есть список абстрактных «анинамлов». т.е.

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 Ответ

1 голос
/ 19 января 2009

Атрибуты XmlElementAttribute и XmlArrayItemAttribute могут использоваться для этого, когда список является полем в другом классе (разница в том, что первый не помещает контейнерный элемент вокруг элементов списка, тогда как последний делает).

Я не верю, что вы можете достичь того, что вы хотите, просто списком, то есть, когда фактический сериализуемый объект является списком (хотя я могу ошибаться здесь), однако вы можете подделать его, вложив список в класс, например,

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

Это немного неуклюжий взлом, но он будет сериализован в то, что вы ищете.

...