Как я могу получить XmlRoot, чтобы иметь коллекцию объектов? - PullRequest
2 голосов
/ 31 марта 2011

Я пытаюсь выяснить, как сериализовать следующий класс в XML (определенным образом, см. Ниже):

[XmlRoot("Farm")]
public class Farm
{
    [XmlArray]
    [XmlArrayItem("Person", typeof(Person))]
    [XmlArrayItem("Dog", typeof(Dog))]
    public List<Animal> Animals { get; set; }
}

(Предположим, что Dog и Person оба получены изAnimal, и у них обоих есть свойство Name, которое украшено [XmlAttribute("Name")].)

Мне нужно создать этот объект:

var myFarm = new Farm
{
    Animals = new List<Animal> { 
        new Person { Name = "Bob" },  
        new Dog { Name = "Fido" }
    }
};

...и пусть он сериализуется в следующий документ:

<?xml version="1.0"?>
<Farm>
    <Person Name="Bob"/>
    <Dog Name="Fido"/>
</Farm>

Но, когда я сериализую myFarm (вывод результатов на консоль), вот так:

var serializer = new XmlSerializer(typeof(Farm));
var namespaces = new XmlSerializerNamespaces();
namespaces.Add("", "");
serializer.Serialize(System.Console.Out, myFarm, namespaces);

... результатэто:

<?xml version="1.0"?>
<Farm>
    <Animals>
        <Person Name="Bob"/>
        <Dog Name="Fido"/>
    </Animals>
</Farm>

Обратите внимание на дополнительный нежелательный Animals элемент.Как мне избавиться от этого?Изменение схемы XML не вариант, но изменение кода.Мне бы очень хотелось обойти эту проблему, и я надеюсь, что кто-то знает о легком исправлении (или знает, что не легко это исправить).

Спасибо!

1 Ответ

2 голосов
/ 31 марта 2011

Вместо этого используйте следующие атрибуты:

[XmlRoot("Farm")]
public class Farm
{
    [XmlElement("Person", typeof(Person))]
    [XmlElement("Dog", typeof(Dog))]
    public List<Animal> Items { get; set; }
}
...