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