Cómo cambiar el nombre del atributo XML que se generó después de la serialización de la lista de objetos

Estoy serializando la Lista de objetos List , y XmlSerializer genera el atributo , quiero cambiarle el nombre o eliminarlo.
¿Se puede hacer con la creación de una nueva clase que encapsule la Lista como campo?

  [XmlRoot("Container")] public class TestObject { public TestObject() { } public string Str { get; set; } } List tmpList = new List(); TestObject TestObj = new TestObject(); TestObj.Str = "Test"; TestObject TestObj2 = new TestObject(); TestObj2.Str = "xcvxc"; tmpList.Add(TestObj); tmpList.Add(TestObj2); XmlWriterSettings settings = new XmlWriterSettings(); settings.OmitXmlDeclaration = true; settings.Indent = true; XmlSerializer serializer = new XmlSerializer(typeof(List)); using (XmlWriter writer = XmlWriter.Create(@"C:\test.xml", settings)) { XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(); namespaces.Add(string.Empty, string.Empty); serializer.Serialize(writer, tmpList, namespaces); }   Test   xcvxc   

La forma más confiable es declarar una clase de DTO más externa:

 [XmlRoot("myOuterElement")] public class MyOuterMessage { [XmlElement("item")] public List Items {get;set;} } 

y serializar eso (es decir, poner su lista en otro objeto).


Puede evitar una clase contenedora, pero yo no:

 class Program { static void Main() { XmlSerializer ser = new XmlSerializer(typeof(List), new XmlRootAttribute("Flibble")); List foos = new List { new Foo {Bar = "abc"}, new Foo {Bar = "def"} }; ser.Serialize(Console.Out, foos); } } public class Foo { public string Bar { get; set; } } 

El problema con esto es que cuando utiliza atributos personalizados, debe tener mucho cuidado para almacenar y reutilizar el serializador; de lo contrario, obtendrá muchos ensamblajes dynamics cargados en la memoria. Esto se evita si solo usa el XmlSerializer(Type) , ya que lo almacena en caché internamente de forma automática.

Cambie la siguiente línea de:

 XmlSerializer serializer = new XmlSerializer(typeof(List)); 

A:

 XmlRootAttribute root = new XmlRootAttribute("TestObjects"); XmlSerializer serializer = new XmlSerializer(typeof(List), root); 

Deberia de funcionar.

Crea otra clase como:

  [XmlRoot("TestObjects")] public class TestObjects: List { } 

A continuación, aplique el código siguiente al sellar:

  XmlSerializer serializer = new XmlSerializer(typeof(TestObjects)); MemoryStream memStream = new MemoryStream(); serializer.Serialize(memStream, tmpList);