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

标签 c# .net xml serialization xmlserializer

<分区>

我正在使用 XmlSerializer 与服务通信。这不是常规的 SOAP 服务,它有自己的 XML 对象类型。例如,我可能会要求 <Capabilities>对象,但它可能返回 <Exception> .因此,换句话说,我必须处理随机的 XML 文档类型。但是,我知道我必须处理哪些类型。

我正在尝试做的是找到一种通用方法来序列化/反序列化这些文档。问题是 XmlSerializer 需要在创建阶段知道类型。

这些没有封装在公共(public)根元素中,因此创建一个基类并使用 [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 Constructor (Type, Type[]) ... 初始化 XmlSerializer 类的新实例,该类可以将指定类型的对象序列化为 XML 文档,并将 XML 文档反序列化为指定类型的对象。如果属性或字段返回数组,则 extraTypes 参数指定可以插入到数组中的对象。

关于c# - 使用 XmlSerializer 反序列化随机/未知类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8210386/

相关文章:

c# - SelectSingleNode 总是返回 null?

c# - 将父类转换到子类

C# Visual Studio 递增计时器

c# - 如果 DateTime 是不可变的,为什么下面的工作?

c# - 使用 C# 获取/设置 "File History"(Windows 8) 设置

php - 具有多个参数的 SOAP XML 函数调用

c# - 将点从一个三角形变换到另一个三角形

c# - Visual Studio 即时窗口 "Internal error in the expression evaluator"

c# - 如何检索字典 <?,?> 中包含的所有键值对?

Android - 将填充设置为 RadioButton pin