使用XmlSerializer反序列化随机/未知类型

本文关键字:未知 类型 随机 XmlSerializer 反序列化 使用 | 更新日期: 2023-09-27 18:15:13

我使用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实例之前将其映射到正确的类型。

有更好的方法吗?

使用XmlSerializer反序列化随机/未知类型

正如您所提到的,当您请求服务时可能会返回。所以你知道如果一个请求是针对一个类型的那么服务可能只返回某些类型吗?

我会尝试XmlSerializer Constructor (Type, Type[])…初始化XmlSerializer类的新实例,该类可以将指定类型的对象序列化为XML文档,并将XML文档反序列化为指定类型的对象。如果属性或字段返回一个数组,则extraTypes参数指定可以插入到该数组中的对象。