Как переименовать атрибут 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>
Ответы
Ответ 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);