Отключить случайные/неизвестные типы с помощью XmlSerializer

Я использую 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.

Есть ли лучший способ сделать это?

Ответ 2

Как вы упомянули, когда вы запросите услугу, она может вернуться. Итак, знаете ли вы, был ли запрос создан для типа, тогда служба может вернуть только определенные типы?

Я бы попробовал XmlSerializer Constructor (Тип, Тип [])... Инициализирует новый экземпляр класса XmlSerializer, который может сериализовать объекты указанного типа в XML-документы и десериализовать XML-документы в объект определенного типа. Если свойство или поле возвращает массив, параметр extraTypes указывает объекты, которые могут быть вставлены в массив.