序列化组合的功能?

时间:2010-09-01 18:08:53

标签: c# serialization delegates function-composition

这很好用:

    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.

现在,我可以解决这个问题,但是我想了解为什么会发生这种情况,以便将来如果我别无选择,只能在序列化之前编写函数,我将有一个解决方案。

1 个答案:

答案 0 :(得分:10)

第二种情况发生的事情是涉及到关闭。在func1内部使用func2会创建一个闭包来捕获lambda表达式之间的共享状态。闭包不可序列化。当你尝试序列化func时,它会尝试序列化目标对象,这是一个闭包,你得到了你的异常。