13

Serializable としてマークされた単純なクラスがあり、たまたまイベントがあります。イベント メンバーを NonSerialized としてマークしようとしましたが、コンパイラが文句を言います。しかし、クラス インスタンスをシリアル化しようとすると、BinaryFormatter は、イベントがシリアル化できないという例外をスローします。イベントを持つクラスをシリアル化できないということですか? もしそうなら、コンパイラは前もってそう言うべきです。

Stream file = File.Open("f", FileMode.Open);
BinaryFormatter bf = new BinaryFormatter();

object obj = null;
try
{
    obj = bf.Deserialize(file);
}
catch (System.Runtime.Serialization.SerializationException e)
{
    MessageBox.Show("De-Serialization failed : {0}", e.Message);
}
file.Close();

System.Collections.ArrayList nodeList = obj as System.Collections.ArrayList;

foreach (TreeNode node in nodeList)
{
    treeView.Nodes.Add(node);
}

次のクラスでは動作しません:

[Serializable()]
class Simple
{
    private int myInt;
    private string myString;
    public event SomeOtherEventDefinedElsewhere TheEvent;

}

4

3 に答える 3

25

「イベントの場合、属性がイベント自体ではなく基になるデリゲートに適用されるように、NonSerialized 属性を適用するときにフィールド属性修飾子も追加する必要があります」 Advanced Serialization - MSDN


NonSerializedAttributewith フィールドのプレフィックス

[field:NonSerialized]
public event MyEventHandler MyEvent;
于 2010-02-22T03:30:59.637 に答える
0

これが遅い投稿であることは知っていますが、これがこの質問に対する実際の回答です。イベントに対して手動で追加/削除する「ゲッター/セッター」を作成し (コンパイラーがこれをバックグラウンドで実行しますが、この場合は明示的に行う必要があります)、イベントを NonSerialized としてマークします。コードを詳しく説明する時間はありませんが、簡単に検索すると、同じ問題に遭遇した人が見つかります。

http://sanity-free.org/113/csharp_binary_serialization_oddities.html

ただし、次の行は使用しないでください: [MethodImpl(MethodImplOptions.Synchronized)]

これは、C# 4 で修正されたスレッド セーフの問題につながります。見る :

http://blogs.msdn.com/b/cburrows/archive/2010/03/05/events-get-a-little-overhaus-in-c-4-part-i-locks.aspx

独自のロックレスの代替手段を (CAS を使用して) ロールするか、オンラインで検索する必要があります。残念ながら、私は走らなければならないので時間がありませんが、あなたはその考えを理解しています.

お役に立てれば!

于 2015-08-06T21:13:54.200 に答える
0

属性はイベントではなくデリゲートに適用され、大文字と小文字が区別されることを覚えておくことが重要です[Field:NonSerialized]。その後、ISerializable オブジェクトを実装し、リフレクションを使用して、シリアル化するクラスを反復処理し、イベント ハンドラーを探します。シリアル化する前に、まずイベントのサブスクライブを解除します。次に、逆シリアル化を行うときに、必要に応じて、逆シリアル化時に自動的にイベントを関連付けることができます...

于 2010-02-22T03:51:17.370 に答える