17

シリアル化可能としてマークされていないオブジェクトによってイベントが処理されると、シリアル化が失敗するため、イベントクラスメンバーのシリアル化を回避する必要があります。

EventクラスメンバーでNonSerialized属性を使用しようとしましたが、コンパイルに失敗します。このコード行:

<NonSerialized()> Public Event PropertyValueChanged()

次のエラーが発生します。

この宣言タイプでは属性が無効であるため、属性'NonSerializedAttribute'を'PropertyValueChanged'に適用できません。

Public Event PropertyValueChanged() ' compiles but needs the extra handling described below

イベントメンバーのシリアル化を回避する別の方法はありますか?

イベントが処理されない場合、これは問題ではありません。オブジェクトをシリアル化する前に、オブジェクトのクローンを作成する(そしてイベントを無視する)ことで回避できます。もっと良い方法があるかどうか疑問に思っています。

ありがとう。

4

3 に答える 3

36

C#では、以下のようにこれを行うことができるので、これがVBと同じように変換されることを願っています。

addこれは、フィールドのようなイベント(つまり、独自の/がない場合remove)にのみ適用されることに注意してください。

[field: NonSerialized]
public event EventType EventName;

それ以外の場合:

[NonSerialized]
EventType backingField;
public event EventType {
    add { backingField += value; }
    remove { backingField -= value; }
}
于 2010-03-05T19:30:20.663 に答える
6

コンパイラが実際にイベントのバッキングフィールドを生成するため、機能していません。これを有効にするには、属性の前にフィールドを付けるだけです。

[field: NonSerialized]
public event EventHandler PropertyValueChanged;
于 2010-03-05T19:31:45.063 に答える
0

過去にプロジェクトでこれを行った方法は、IXmlSerializableインターフェイスを実装し、シリアル化を手動で制御することです。これにより、GUIベースのコントロール(多くのイベントを含む)のシリアル化がはるかに簡単になります。

IXmlSerializable

于 2010-03-05T19:31:56.577 に答える