使用 StringReader 与 XmlNodeReader 反序列化对象属性

编程入门 行业动态 更新时间:2024-10-27 11:28:22
本文介绍了使用 StringReader 与 XmlNodeReader 反序列化对象属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

为什么在使用 XmlNodeReader 而不是像这样的空字符串反序列化空类型元素时,XmlSerializer 会用 XmlNode 数组填充我的对象属性使用 StringReader(或 XmlTextReader)时会怎样?

Why does XmlSerializer populate my object property with an XmlNode array when deserializing an empty typed element using XmlNodeReader instead of an empty string like it does when using StringReader (or XmlTextReader)?

以下代码示例中的第二个断言失败:

The second assertion in the following code sample fails:

var doc = new XmlDocument(); doc.Load(new StringReader(@" <Test xmlns:xsi=""www.w3/2001/XMLSchema-instance"" xmlns:xsd=""www.w3/2001/XMLSchema""> <Value xsi:type=""xsd:string"" /> </Test>")); 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 文档的子集而不将其转换回字符串并重新解析?

I'm guessing it has something to do with the null internal NamespaceManager property but I'm not sure how to work around this mysterious limitation. How can I reliably deserialize a subset of my parsed XML document without converting it back into a string and re-parsing?

推荐答案

看起来这是一个非常古老的 XmlNodeReader 错误,微软无意修复.(存档的 Microsoft Connect 链接 此处).我在 Lev Gimelfarb 的博客 此处 将名称空间添加到阅读器的NameTable 中作为查找前缀.

It looks like this is a very old XmlNodeReader bug that Microsoft have no intention of fixing. (Archived Microsoft Connect link here). I found a workaround on Lev Gimelfarb's blog here that adds namespaces to the reader's NameTable as prefixes are looked up.

public class ProperXmlNodeReader : XmlNodeReader { public ProperXmlNodeReader(XmlNode node) : base(node) { } public override string LookupNamespace(string prefix) { return NameTable.Add(base.LookupNamespace(prefix)); } }

更多推荐

使用 StringReader 与 XmlNodeReader 反序列化对象属性

本文发布于:2023-08-04 05:53:35,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1293537.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:属性   对象   序列化   StringReader   XmlNodeReader

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!