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

我正在使用XmlSerializer与服务进行通信。 这不是常规的SOAP服务,它有自己的XML对象类型。 例如,我可能会要求对象,但它可能会返回 。 所以,换句话说,我必须处理随机的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实例之前将其映射到正确的类型。

有没有更好的方法呢?

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

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

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