【问题标题】:Deserialize random/unknown types with XmlSerializer [duplicate]使用 XmlSerializer 反序列化随机/未知类型
【发布时间】:2012-01-02 20:49:36
【问题描述】:

我正在使用 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 对于您所描述的模型不能很好地发挥作用。有一些技巧可以更通用地执行此操作,但它们取决于您的 BaseClass 被封装在根元素中。您可以在您的 xml 周围添加此根元素,然后应用此方法,或使用您的 XmlInclude。见codeproject.com/KB/XML/xmlserializerforunknown.aspx

标签: c# .net xml serialization xmlserializer


【解决方案1】:

我不知道它是否更好,但您可以尝试DynamicObject 方法。 http://blogs.msdn.com/b/csharpfaq/archive/2009/10/19/dynamic-in-c-4-0-creating-wrappers-with-dynamicobject.aspx

【讨论】:

    【解决方案2】:

    正如您在请求服务时提到的,可能会返回。那么你知道如果对某个类型发出请求,那么服务可能只返回某些类型吗?

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

    【讨论】:

    • 那是正确的,我可以期待某些类型,它有 3-4 种不同的类型。我尝试过使用 (Type, Type[]) 的构造函数,但没有运气。它实际上与使用 XmlIncludeAttribute 相同。
    猜你喜欢
    • 2020-12-09
    • 1970-01-01
    • 2010-10-15
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多