XmlSerializer可以反序列化为Nullable <int>吗?</int>

时间:2008-11-20 21:16:51

标签: xml-serialization nullable xml-nil

我想将包含可以标记为nil="true"的元素的XML消息反序列化为具有类型int?的属性的类。我能够让它工作的唯一方法是编写我自己的NullableInt类型来实现IXmlSerializable。有没有更好的方法呢?

我写了完整的问题以及我解决它的方式on my blog

3 个答案:

答案 0 :(得分:6)

我认为您需要在命名空间前加上nil =“true”前缀,以便XmlSerializer反序列化为null。

MSDN on xsi:nil

<?xml version="1.0" encoding="UTF-8"?>
<entities xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="array">
  <entity>
    <id xsi:type="integer">1</id>
    <name>Foo</name>
    <parent-id xsi:type="integer" xsi:nil="true"/>

答案 1 :(得分:3)

我的修复方法是预处理节点,修复任何“nil”属性:

public static void FixNilAttributeName(this XmlNode @this)
{
    XmlAttribute nilAttribute = @this.Attributes["nil"];
    if (nilAttribute == null)
    {
        return;
    }

    XmlAttribute newNil = @this.OwnerDocument.CreateAttribute("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance");
    newNil.Value = nilAttribute.Value;
    @this.Attributes.Remove(nilAttribute);
    @this.Attributes.Append(newNil);
}

我将这个与子节点的递归搜索结合起来,这样对于任何给定的XmlNode(或XmlDocument),我可以在反序列化之前发出一个调用。如果要保持原始内存中结构不被修改,请使用XmlNode的Clone()。

答案 2 :(得分:0)

这种非常懒惰的方式。它的脆弱性有很多原因,但我的XML很简单,可以保证这么快速和肮脏的修复。

xmlStr = Regex.Replace(xmlStr, "nil=\"true\"", "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"");