Атрибуты XmlElementAttribute
и XmlArrayItemAttribute
могут использоваться для этого, когда список является полем в другом классе (разница в том, что первый не помещает контейнерный элемент вокруг элементов списка, тогда как последний делает).
Я не верю, что вы можете достичь того, что вы хотите, просто списком, то есть, когда фактический сериализуемый объект является списком (хотя я могу ошибаться здесь), однако вы можете подделать его, вложив список в класс, например,
[XmlRoot("Animals")]
[XmlType("Animals")]
public class AnimalsWrapper
{
[XmlElement(typeof(Bird), ElementName = "Bird")]
[XmlElement(typeof(Cat), ElementName = "Cat")]
public List<Animal> Animals;
}
Это немного неуклюжий взлом, но он будет сериализован в то, что вы ищете.