2011-11-21 80 views
13

我正在使用XmlSerializer与服务进行通信。这不是一个常规的SOAP服务,它有它自己的XML对象类型。例如,我可能会要求提供<Capabilities>对象,但它可能会返回<Exception>。换句话说,我必须处理随机的XML文档类型。不过,我知道我需要处理哪些类型。使用XmlSerializer反序列化随机/未知类型

我想要做的是找到一个通用的方法来序列化/反序列化这些文件。问题在于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实例之前将其映射到正确的类型。

有没有更好的方法来做到这一点?

+0

我认为你的方式没问题。 XmlSerializer对于你所描述的模型来说玩的不是很好。有一些技巧可以更一般地做到这一点,但是它们取决于将'BaseClass'封装在根元素中。你可以在你的xml中添加这个根元素,然后应用这个方法,或者使用你的XmlInclude。请参阅http://www.codeproject.com/KB/XML/xmlserializerforunknown.aspx – wal

回答

1

正如您所提到的,您在请求服务时可能会返回。那么你知道是否为一个类型提出了一个请求,那么该服务可能只返回某些类型?

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

+1

这是正确的,我可以删除某些类型,它的3-4种不同类型。 我试过构造函数(Type,Type [])没有运气..它实际上和使用XmlIncludeAttribute一样。 – Oyvind

相关问题