1

それらの型を使用して WPF でデータを表示すると、WCF mex エンドポイント ポイントを介して取得した型をシリアル化する際に問題が発生します。

これは、自動生成された型が INotifyPropertyChanged インターフェイスを実装し、WPF バインディングがそれにサブスクライブするためです。

これを行う通常の方法は、イベント宣言に [field: NonSerialized] を追加することです。クラスは自動生成されたので、私はこれをしたくありません。

また、DataContractSerializer に切り替えたくありません。これは、主に、他のすべての場合に使用している BinaryFormatter がかなり便利であるためです。

私がやりたいのは、リフレクションを使用してシリアル化を開始する前に、イベント データが格納されているフィールドを見つけて、それを NonSerialized としてマークすることです。

ここに私の質問があります:

  1. 実行時に属性を追加することは可能ですか?
  2. イベントに関連付けられたフィールドを見つけるにはどうすればよいですか?
4

1 に答える 1

0

これが私の頭から離れたいくつかのアイデアです。

  1. CodeDomまたはILGeneratorを使用して、シリアル化時に動的プロキシクラス(INotifyPropertyChangedを実装しない)を作成します。次に、AutoMapperなどを使用して、元のオブジェクトグラフをこれらのプロキシクラスにマッピングします。

  2. 唯一の本当の問題がイベントサブスクリプションである場合...そしてこれらのクラスが自動生成されることを知っている場合(したがって、イベントの特別な実装はありません。つまり、通常の基になるフィールドデリゲートを使用するだけです)。 ..シリアル化時にイベントサブスクリプションを一時的に削除してから再度追加することができます。ランダムなグーグルリファレンス:EventInfoからデリゲートオブジェクトを取得する方法は?。基本的に、現在のすべてのイベントサブスクリプションを取得し、デリゲートをクリーンにワイプしてから、サブスクリプションを再度追加することができます。または、基になるデリゲートフィールドをヌルにして、シリアル化が完了したら再設定することもできます。

  3. パフォーマンスについてあまり気にしない場合は 、すべてのFieldInfoのオブジェクトを反映するISerializationSurrogatehttp : //msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializationsurrogate.getobjectdata.aspxを使用できます。デリゲートタイプのフィールドは必ず無視してください。

于 2012-05-06T01:25:05.067 に答える