使用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)); } }