Я использую XmlSerializer для связи с сервисом. Это не обычный SOAP-сервис, он имеет собственные типы объектов XML. Например, я могу попросить объект <Capabilities>
, но он может вернуть <Exception>
. Итак, другими словами, мне приходится иметь дело со случайными типами документов XML. Однако я знаю, с какими типами я должен иметь дело.
То, что я пытаюсь сделать, это найти общий подход к сериализации/десериализации этих документов. Проблема в том, что XmlSerializer должен знать тип на этапе создания.
Они НЕ заключены в общий корневой элемент, поэтому создание базового класса и использование атрибута [XmlInclude]
НЕ работает в этом случае:
[XmlInclude(typeof(Exception))]
[XmlInclude(typeof(Capabilities))]
public abstract class BaseClass
{
public BaseClass()
{
SchemaLocation = "test";
}
[XmlAttribute("schemaLocation")]
public String SchemaLocation { get; set; }
}
[XmlRoot("Exception")]
public class Exception : BaseClass
{
public Exception():base()
{
}
[XmlElement]
public String Message { set; get; }
}
[XmlRoot("Capabilities")]
public class Capabilities : BaseClass
{
public Capabilities() : base()
{}
[XmlElement]
public String ServiceName { set; get; }
}
Мое решение до сих пор заключается в том, чтобы вручную исследовать корневой элемент с помощью XmlReader, а затем сопоставить его правильному типу перед созданием экземпляра XmlSerializer.
Есть ли лучший способ сделать это?