2009-12-16 109 views
4

这是Can XmlSerializer deserialize into a Nullable<int>?的重复,但我需要的解决方案既不改变xml文件也不强迫我实现IXmlSerializable接口。我不想实现IXmlSerializable,因为我在<number>旁边有许多额外的元素,它们可以正确地反序列化。XmlSerializer可以反序列化为可空的<int>?

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

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

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

不起作用。

+0

你使用的是什么版本?我做了一个类似的类,输出是 ChaosPandion 2009-12-19 02:16:23

+0

是的,这是有效的。如果您无法容忍xs:nil =“true”,则需要采取一些替代步骤。 – Cheeso 2009-12-19 02:46:42

回答

8

您可以使用代理属性。

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; 
    } 
} 
+0

似乎有点麻烦,我是对的吗?看到我上面的评论。 – ChaosPandion 2009-12-19 02:22:37

+0

是的,这是一个麻烦,但有时它是必要的。如果你想'',而不是'',那么你需要做额外的工作。 – Cheeso 2009-12-19 02:47:48

-1

你总是可以在最终的xml输出上做一个字符串替换。

Replace(" i:nil=\"true\"/>","/>"); 

一般情况下,这是一个坏主意,试图在与字符串操作XML破解,但上面的替代是安全的,总是会转化<anything i:nil="true"/><anything/>

这是一个黑客,但考虑到替代方案是一个可接受的。

+0

-1:如果为“nil”所在的命名空间使用不同的前缀,该怎么办?如果名称空间声明碰巧存在于该元素上怎么办? – 2010-01-27 18:56:41

相关问题