0

オブジェクトをシリアル化しようとすると、次のエラーが発生します。

Type
'TEST.Common.TestObj`1+<>c__DisplayClass1`1[[TEST.Common.TestEntity,
TEST.Common, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null],[System.Boolean, mscorlib, Version=4.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089]]' in Assembly
'Test.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'
 is not marked as serializable.

エンティティ、そのすべての基本エンティティ、およびそれらのプロパティに関連するすべてのエンティティの[Serializable]両方に属性があります。TestObjこの「シリアル化可能としてマークされていません」というエラーの原因は他に何が考えられますか?

とはどういうc__DisplayClass1`1意味ですか??

4

2 に答える 2

5

あなたの c_DisplayClass1'1 をググったところ、次のことがわかりました。

http://rantdriven.com/post/2011/07/09/The-Mysterious-2b3c3ec__DisplayClass1.aspx

シリアル化しようとしているイベントハンドラーである可能性について、いくつかのリンクと説明があります。

これは役立つコメントのようです:

主な問題は、シリアル化されているものに関係しています。デフォルトでは、イベント ハンドラーは、コンパイル時に生成されたフィールドによって内部的に表されます。このフィールドは、イベントが発生したときに呼び出されるデリゲートへの参照を保持します。

上記の例を使用すると、定義されたスコープを超えてリソースにアクセスする匿名メソッドを使用しているため、例外が発生します。内部では、匿名メソッドを表すクラス (おそらく "<>c__DisplayClass1" と呼ばれる) が作成されます。このメソッドは [Serializable()] 属性でマークされません。オブジェクトをシリアライズしようとすると、そのフィールドをシリアライズしようとし、例外がスローされます。

次のいずれかの方法でコードを修正できます。

イベントのシリアライゼーションを維持したい場合 (Serializable クラスではデフォルトでオンになっています)、最も簡単な方法は、'addedMessage' 変数を匿名メソッドに移動して、そのイベントのローカル変数にアクセスしないようにすることです。含むスコープ。

イベントのシリアル化が重要でない場合は、イベント フィールドを手動で宣言し、[NonSerialized()] 属性でマークしてから、イベント ブロックで add および remove アクセサーを使用してデリゲート参照を管理できます。

于 2013-05-18T21:52:38.703 に答える
0

シリアライズ可能としてマークされていない、コンパイラによって生成されたクロージャ クラスをシリアライズしようとしています。Serializable属性で注釈を付ける方法はありません。

于 2013-05-18T21:49:53.207 に答える