Самый надежный способ - объявить внешний класс DTO:
[XmlRoot("myOuterElement")]
public class MyOuterMessage {
[XmlElement("item")]
public List<TestObject> Items {get;set;}
}
и сериализовать , что (т.е. поместить ваш список в другой объект).
Вы можете избегать класса-оболочки, но я бы не стал:
class Program
{
static void Main()
{
XmlSerializer ser = new XmlSerializer(typeof(List<Foo>),
new XmlRootAttribute("Flibble"));
List<Foo> foos = new List<Foo> {
new Foo {Bar = "abc"},
new Foo {Bar = "def"}
};
ser.Serialize(Console.Out, foos);
}
}
public class Foo
{
public string Bar { get; set; }
}
Проблема в том, что при использовании пользовательских атрибутов вам необходимобудьте очень осторожными для хранения и повторного использования сериализатора, в противном случае вы получите лотов динамических сборок, загруженных в память.Этого можно избежать, если вы просто используете конструктор XmlSerializer(Type)
, поскольку он автоматически кеширует это.