使用StringReader与XmlNodeReader反序列化对象属性
为什么XmlSerializer
在使用XmlNodeReader
反序列化空类型元素而不是像使用StringReader
(或XmlTextReader
)时那样的空字符串时,用XmlNode
数组填充我的对象属性?
以下代码示例中的第二个断言失败:
var doc = new XmlDocument(); doc.Load(new StringReader(@" ")); var ser = new XmlSerializer(typeof (Test)); var reader1 = new StringReader(doc.InnerXml); var obj1 = (Test) ser.Deserialize(reader1); Debug.Assert(obj1.Value is string); var reader2 = new XmlNodeReader(doc.FirstChild); var obj2 = (Test) ser.Deserialize(reader2); Debug.Assert(obj2.Value is string); public class Test { public object Value { get; set; } }
我猜它与null内部NamespaceManager
属性有关,但我不知道如何解决这个神秘的限制。 如何可靠地反序列化我解析的XML文档的子集,而不将其转换回字符串并重新解析?
看起来这是一个非常古老的XmlNodeReader
错误, 微软无意修复它 。 ( 此处存档的Microsoft Connect链接)。 我在Lev Gimelfarb的博客上找到了一个解决方法,在查找前缀时向读者的NameTable添加名称空间。
public class ProperXmlNodeReader : XmlNodeReader { public ProperXmlNodeReader(XmlNode node) : base(node) { } public override string LookupNamespace(string prefix) { return NameTable.Add(base.LookupNamespace(prefix)); } }