2011-12-18 3 views
5

XmlSerializerによって作成されたXMLに、既定値のプロパティが含まれないようにしたいとします。これはXmlSerializerで可能ですか、IXmlSerializableを調べる必要がありますか?XmlSerializerでプロパティの値に応じてプロパティを無視する方法

は例えば、私は次のクラスを持っていることがあります。

public class PositionedObject 
{ 
    public float X 
    { get; set; } 

    public float Y 
    { get; set;} 
} 

私はそれがPositionedObjectのインスタンスをシリアル化したときに値が0であれば、Xを含まないようにというのXmlSerializerをお伝えしたいと思います(と同じ0の場合はYで)。シリアライザは、プロパティをシリアルすべきかどうかを判断するために、このメソッドを呼び出します

public bool ShouldSerializeX() 
{ 
    return X != 0; 
} 

答えて

9

ただ値が0でない場合にtrueを返すShouldSerializeXという名前のメソッドを宣言します。

+1

この回答は不十分です。シリアライザがこのような方法についてどのように知っているかわかりません。しかも、これはスケーラビリティがありません。 – Amy

+1

@Inuyasha、あなたはそれを試しましたか?私はそれが動作することを知って、私はこのソリューションを何度も使用しました。これは文書化されていませんが、XMLシリアライザコードを見ると、このメソッドが存在する場合はそのメソッドを呼び出すことがわかります(あるいは、XSpecifiedという名前の読み取り専用プロパティを作成することもできます)。とにかく、もっとスケーラブルな方法を知っていますか? –

+0

犬夜叉 - 実際に試しましたか?この回答に基づいて、私はGoogleにいくつかのことを話すことができ、これがうまくいくと主張するいくつかの記事を見つけました。私は今実施中です。ここにいくつかの情報があります:http://horacegoescoding.blogspot.com/2009/04/using-shouldserialize-for-conditional.html –

1

クラスはIXmlSerializableを実装でき、WriteXmlメソッドでは、デフォルトとみなす属性をシリアル化しないことを選択します。あなたの位置で

public class PositionedObject : IXmlSerializable 
{ 

    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     if ( Position != DefaultPosition) 
      writer.WriteAttributeString("Position", Position); 
    } 
} 

はフロートペアであり、あなたが

+2

もし可能であれば、私はいつも "IXmlSerializableを実装しないでください"と言っています。特に逆シリアル化のために - それはトラップではぎとられています...可能であれば、私は常にXmlSerializerが直接サポートしていないこのケース)、2番目は、過度に複雑な実装を行うのではなく、XMLに適合するDTOを使用します。 –

0

トーマスの方法は、おそらくあなたが望むものに最も簡単な方法ですいくつかの許容値を使用する必要があります。しかし、技術的な値の型は常に値を持っていると考えて、おそらくそれを直列化する必要があります。 XmlSerializerは、stringまたは他の参照型として宣言する場合は、X要素の追加をスキップします。
もちろん、X座標を文字列として宣言するのは愚かであるかもしれませんが、それはとしてシリアル化されます。となります。に近づきます。XMLかなり見て、トーマスの提案を得ました。

7

もう1つのサポートされているXmlSerializerパターン。

[DefaultValue({whatever})] 
public SomeType SomeProperty {get;set;} 

注しかし、あなたのパラメータなしのコンストラクタこの値を割り当てる必要があります、または予期しない結果が発生します。

+0

私はこのことについて知らなかった。 –

+0

非常にエレガントなソリューションは、私のために働く! –

関連する問題