反序列化对象的属性与StringReader VS XmlNodeReader对象 [英] Deserialize object property with StringReader vs XmlNodeReader

查看:175
本文介绍了反序列化对象的属性与StringReader VS XmlNodeReader对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么的XmlSerializer 反序列化使用空类型的元素<$ c当填充我与的XmlNode 数组对象属性$ C> XmlNodeReader对象,而不是一个空字符串喜欢使用的时候确实 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=""http://www.w3.org/2001/XMLSchema-instance""
          xmlns:xsd=""http://www.w3.org/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; }
}



我猜它是与空内部 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对象错误=htt​​ps://connect.microsoft.com/VisualStudio/feedback/details/772329/xmlserializer-xsi-类型的属性与 - 命名空间 - 不要 - 反序列化,正确与 - XmlNodeReader对象相对=nofollow>微软没有固定的打算。我发现列弗Gimelfarb的博客一种变通方法在这里,增加了命名空间读者的 NameTable 作为前缀查找。

It looks like this is a very old XmlNodeReader bug that Microsoft have no intention of fixing. 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 VS XmlNodeReader对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆