9

これはうまくいきます:

    Func<string, string> func1 = s => s + "func";
    ViewState["function"] = func1;

ただし、これは次のことを行いません。

    Func<string, string> func1 = s => s + "func";
    Func<string, string> func2 = s => func1(s);

    ViewState["function"] = func2;

実行時シリアライゼーション例外をスローします。Type 'MyProjectName._Default+<>c__DisplayClass3' in Assembly 'MyProjectName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

今回はこれを回避できますが、なぜこれが起こっているのかを理解したいので、将来、シリアル化の前に関数を作成するしかない場合は、解決策があります。

4

1 に答える 1

10

2 番目のケースで起こっていることは、閉鎖が関係していることです。func1inside ofを使用するとfunc2、クロージャが作成され、ラムダ式間の共有状態がキャプチャされます。クロージャーはシリアライズできません。func をシリアル化しようとすると、クロージャであるターゲット オブジェクトをシリアル化しようとし、例外が発生します。

于 2010-09-01T18:13:55.767 に答える