2012-05-09 11 views
2

私はラクダの文字列からブールの型をシリアル化する問題を解決する方法を見つけようとしています。ブール型のxmlシリアル化エラー

私は、これはエラーが発生します、次のXML

<Root> 
    <BoolElement> 
    False 
    </BoolElement> 
</Root> 

と以下のクラス

[XmlRoot("Root")] 
public class RootObj{ 
    [XmlElement("BoolElement")] 
    public bool BoolElement{get;set;} 
} 

を持っています。

私は同じクラスを使用し、 "偽"に "偽"の名前を変更する場合は動作します。問題は、XMLを編集できないことです。

どのように私はこれを解決することができます知っていますか?

+0

は、デシリアライズRについては、このないですシリアル化よりもatherですか? – Filburt

答えて

3

あなたはこの無効なXML(XSDによるので、私は無効言う:ブールスキーマFalseが無効な値である):の逆シリアル化を支援するためにバッキングフィールドを使用することができ

[XmlRoot("Root")] 
public class RootObj 
{ 
    [XmlElement("BoolElement")] 
    public string BackingBoolElement 
    { 
     set 
     { 
      BoolElement = bool.Parse(value.ToLower()); 
     } 
     get 
     { 
      return BoolElement.ToString(); 
     } 
    } 

    [XmlIgnore] 
    public bool BoolElement { get; set; } 
} 
+0

デフォルトのXmlシリアル化では、読み書きの両方ではなく、公開されていないプロパティの通知を受けたとは思われませんでしたか? –

+0

@DarinDimitrov似たようなことを試しましたが、XmlIgnoreを使用していませんでした:ありがとうございました! – StrouMfios

+0

最後に、これは解決策ではなく、falseのみを返すためです。私はそれを試してみて、それは偽を返すことを主張する – StrouMfios

4

Falsevalid value for an xsd:booleanではありません(しかし、あなたはfalseに注意し、0あるとして) - あなたがソースデータを変更することができない場合、その後、あなたが純粋にXMLシリアル化のための別のプロパティを持つことができます:

[XmlRoot("Root")] 
public class RootObj{ 
    [XmlElement("BoolElement")] 
    public string BoolElementForSerialization 
    { 
    get 
    { 
     return (this.BoolElement ? "True" : "False"); 
    } 
    set 
    { 
     this.BoolElement = (string.Compare(value, "false", StringComparison.OrdinalIgnoreCase) != 0); 
    } 
    } 

    [XmlIgnore] 
    public bool BoolElement{get;set;} 
}