【发布时间】: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