2009-12-16 98 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

相關問題