Подтвердить что ты не робот

Как переименовать атрибут XML <ArrayOf>, сгенерированный после сериализации Список объектов

Я сериализую Список объектов List<TestObject> , а XmlSerializer генерирует атрибут <ArrayOfTestObject>, я хочу переименовать его или удалить.
Можно ли это сделать с созданием нового класса, который инкапсулировал List как поле?

 [XmlRoot("Container")]    
 public class TestObject
 {
     public TestObject() { }                         
     public string Str { get; set; }                         
 }

 List<TestObject> tmpList = new List<TestObject>();

 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<TestObject>));

 using (XmlWriter writer = XmlWriter.Create(@"C:\test.xml", settings))
 {              
     XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
     namespaces.Add(string.Empty, string.Empty);
     serializer.Serialize(writer, tmpList, namespaces);                            
}


<ArrayOfTestObject>
  <TestObject>
    <Str>Test</Str>
  </TestObject>
  <TestObject>
    <Str>xcvxc</Str>
  </TestObject>
</ArrayOfTestObject>
4b9b3361

Ответ 1

Самый надежный способ - объявить самый внешний класс 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), поскольку он автоматически кэширует его автоматически.

Ответ 2

Измените следующую строку:

XmlSerializer serializer = new XmlSerializer(typeof(List<TestObject>));

To:

XmlRootAttribute root = new XmlRootAttribute("TestObjects");     

XmlSerializer serializer = new XmlSerializer(typeof(List<TestObject>), root);

Он должен работать.

Ответ 3

Создайте еще один класс:

       [XmlRoot("TestObjects")]
       public class TestObjects: List<TestObject>
       {

       }

Затем примените ниже код при печати:

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