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

7
这是Can XmlSerializer deserialize into a Nullable<int>?的副本,但我需要一个既不改变xml文档也不强制我实现IXmlSerializable接口的解决方案。我不想实现IXmlSerializable,因为除了<number>被正确反序列化之外,还有许多其他附加元素。

我的xml可以包含<number>4</number><number/>元素。

<root>
...
either <number>4</number> or <number/>
... [other elements]
</root>

public class root
{
public int? number {get; set;}
...
}

无法正常工作。


你使用的是哪个版本?我创建了一个类似的类,输出结果为 <number xs:nil="true" />。 - ChaosPandion
没错,那个可以运行。如果你无法容忍 xs:nil="true",你需要采取一些替代措施。 - Cheeso
2个回答

11

你可以使用代理属性。

public class MyType1
{
    // XmlIgnore means it is not directly serialized
    [XmlIgnore]
    public int? number
    {
        get; set;
    }

    // acts as a surrogate for the nullable property
    [XmlElement("number")]
    public string _number_Surrogate
    {
        get
        {
            return (number.HasValue) ? number.ToString() : "";
        }
        set
        {
            if (!value.Equals(""))
            {
                number = Int32.Parse(value);
            }
        }
    }

    public System.DateTime Time
    {
        get; set;
    }
}

看起来有点麻烦,我说的对吗?请看我上面的评论。 - ChaosPandion
是的,这很麻烦,但有时是必要的。如果你想要<number/>而不是<number xs:nil='true'/>,那么你需要做额外的工作。 - Cheeso

-2
你可以在最后的 xml 输出上进行字符串替换。
Replace(" i:nil=\"true\"/>","/>");

通常,尝试使用字符串操作来攻击xml是一个坏主意,但上面的替换是安全的,并且始终会将<anything i:nil="true"/>转换为<anything/>
这是一种hack方法,但考虑到替代方案,它是可以接受的。

-1:如果命名空间中使用了不同的前缀,会怎样?如果命名空间声明恰好出现在该元素上,又会怎样? - John Saunders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接