Пользовательская XmlSerialization для вложенных / дочерних объектов
У меня есть сценарий, в котором у меня есть класс Resource, в который вложены два других класса; Action and ResourceURL. Мне нужно написать собственный xmlserializer для Resource и Action, но не для ResourceURL. Я реализовал IXmlSerializable для обоих.
Проблема заключается в том, что при сериализации Resource я вызываю Action.WriteXML(XmlWriter), чтобы получить сериализованную форму Action, но я не могу получить сериализованную форму ResourceURL. Теги становятся все перепутаны, и это также добавляет тег.
Так как же сериализовать объект, который имеет сериализацию клиента для одних вложенных объектов, но не для других?
1 ответ
Решение
Вот пример метода WriteXml:
void IXmlSerializable.WriteXml(XmlWriter writer)
{
// Simple string value:
writer.WriteAttributeString("Name", this.Name);
// Object without IXmlSerializable implementation:
writer.WriteStartElement("NonCustomObject");
new XmlSerializer(NonCustomObjectType).Serialize(writer, this.NonCustomObject);
writer.WriteEndElement();
// Object with IXmlSerializable implementation:
writer.WriteStartElement("CustomObject");
(this.CustomObject as IXmlSerializable).WriteXml(writer);
writer.WriteEndElement();
}
Вот соответствующий метод ReadXml:
void IXmlSerializable.ReadXml(XmlReader reader)
{
// Simple string value
this.Name = reader.GetAttribute("Name");
// Object without IXmlSerializable implementation here:
reader.ReadStartElement();
if (reader.Name == "NonCustomObject")
{
reader.ReadStartElement();
this.NonCustomObject = new XmlSerializer(NonCustomObjectType).Deserialize(reader);
reader.ReadEndElement();
}
// Object with IXmlSerializable implementation here:
reader.ReadStartElement();
if (reader.Name == "CustomObject")
{
(this.CustomObject as IXmlSerializable).ReadXml(reader);
reader.ReadEndElement();
}
}