1

多くの場合、他の複雑なオブジェクトのコレクションを持つさまざまな複雑なオブジェクトがあります。必要なときにのみコレクションをロードしたい場合があるため、コレクションがロードされたかどうかを追跡する方法が必要です (null/empty は、必ずしもロードされていないことを意味しません)。これを行うために、これらの複雑なオブジェクトは、読み込まれたコレクションのコレクションを保持するクラスから継承します。次に、追跡したいコレクションごとにセッターに関数の呼び出しを追加する必要があります。

public List<ObjectA> ObjectAList {
    get { return _objectAList; }
    set { 
        _objectAList = value; 
        PropertyLoaded("ObjectAList");
    }
}

PropertyLoaded 関数は、読み込まれたコレクションを追跡するコレクションを更新します。

残念ながら、これらのオブジェクトは Web サービスで使用されるため、(デ) シリアル化され、すべてのセッターが呼び出され、PropertyLoaded が実際には呼び出されていないときに呼び出されます。

理想的には、OnSerializing/OnSerialized を使用できるようにして、関数が正当に呼び出されているかどうかを認識できるようにしたいのですが、XmlSerializer を使用しているため、これは機能しません。DataContractSerializer を使用するように変更したいのですが、さまざまな理由で現時点では変更できません。

シリアル化が行われているかどうかを知る他の方法はありますか? そうでない場合、または代わりに、新しいコレクションを追跡する必要があるたびに追加のコードを作成することなく、上記を達成するためのより良い方法はありますか?

4

1 に答える 1

3

XmlSerializerシリアライゼーション コールバックをサポートしていません。ただし、いくつかのオプションがあります。たとえば、 というプロパティをシリアル化するかどうかを選択するObjectAList場合は、メソッドを追加できます。

public bool ShouldSerializeObjectAList () { /* logic */ }

逆シリアル化中にも知る必要がある場合は、次を使用できます。

[XmlIgnore]
public bool ObjectAListSpecified {
    get { /* logic whether to include it in serialization */ }
    set { /* logic to apply during deserialization */ }
}

(確かではありませんが、setはその場合にのみ呼び出されることがわかるかもしれませんがtrue)

もちろん、もう 1 つのオプションは を実装することIXmlSerializableですが、これは最後の手段としてのみ実行する必要があります。面白くない。

于 2010-03-24T12:43:04.517 に答える