作者:mobiledu2502890777 | 来源:互联网 | 2023-09-10 22:45
使用XmlSerializer反序列化随机未知类型我正在使用XmlSerializer与服务进行通信。这不是常规的SOAP服务,它有自己的XML对象类型。例如,我可能会要求对象,但
使用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参数指定可以插入到数组中的对象。
上述就是C#学习教程:使用XmlSerializer反序列化随机/未知类型分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—编程笔记