2017-01-05 8 views
0

Web APIと通信するために、XMLにシリアライズされ、APIに送信されるいくつかのクラスを作成しました。 APIは、デフォルト以外の値を持つプロパティのみを保持する場合にのみ、これらのXMLを受け入れます。値に基づいて直列化からプロパティを除外する方法は?

シリアル化中にプロパティを削除するにはどうすればよいですか? (簡略化した例)次のように

私はクラスがあると仮定:

[XmlRoot("SomeData")] 
public class SomeData 
{ 
    [XmlElement("rangeX")] 
    public int RangeX { get; set; } 

    [XmlElement("rangeY")] 
    public int RangeY { get; set; } 

    [XmlElement("rangeZ")] 
    public int RangeZ { get; set; } 
} 

RangeXとRangeYための非デフォルト値を持つオブジェクトは、このようのみrangeXタグを保持しているXMLにシリアル化する必要があるとrangeY。

null値を取り除く方法を見つけましたが、これは私が望むものではありません。デフォルト値はnullと非常に異なる場合があります。

ありがとうございます!

+0

これでLINQを試してみてください。たとえば、シリアル化する前に、 'var newSomeData = existingSomeData.Select(x => x);'のようなものです。 –

+0

@ KraangPrimeでは、そのように_property_を除外できますか? –

+0

@ C.Evenhuis - 同じメソッドを使用して、プロパティを持たない新しいクラスに '変換'する場合は、そうです。あなたの解決策はかなりセクシーなものです –

答えて

3

あなたが「秘密」ShouldSerializeXxxを(使用することができます)方法:

public bool ShouldSerializeRangeX() 
{ 
    return RangeX != someDefaultValue; 
} 

あなたはShouldSerializeデフォルト値の検索例のトンがありますが、それはあなたがドン場合は見つけることだけでは難しいですあなたが探しているものを知っている。ここで

は、あなたが始めるのに役立つためのリンクです:Defining Default Values with the ShouldSerialize and Reset Methods

+1

必要な前述の情報のためのMSDNリンクを追加しました:) –

1

あなたは以来のみデータを書き込むためのコードを含むIXmlSerializableインターフェースを(実装時にあなたがあなたのクラスのオブジェクトがシリアライズされる方法についての完全な制御を得ることができますそれはあなたの直ぐ質問です):

public class SomeData : IXmlSerializable 
{ 
    public int RangeX { get; set; } 

    public int RangeY { get; set; } 

    public int RangeY { get; set; } 

    public void WriteXml (XmlWriter writer) 
    { 
     writer.WriteStartElement("SomeData"); 
     if (RangeX != 0) 
     { 
      writer.WriteElementString("rangeX", RangeX.ToTring()); 
     } 
     if (RangeY != 0) 
     { 
      writer.WriteElementString("rangeY", RangeY.ToTring()); 
     } 
     if (RangeZ != 0) 
     { 
      writer.WriteElementString("rangeZ", RangeZ.ToTring()); 
     } 
     writer.WriteEndElement(); 
    } 

    public void ReadXml (XmlReader reader) 
    { 
     //Implement if needed 
     throw new NotImplementedException(); 
    } 

    public XmlSchema GetSchema() 
    { 
     return null; 
    } 
} 
+0

C.Evenhuisによって投稿された解決策は、私たちの既存のコードベースの変更が少なくなるためです。しかし、あなたが投稿した解決策は、結果として得られるXMLを完全に制御する方法を教えてくれました。だから私は明示的に投稿してくれてありがとう!! – Joe

関連する問題