Сериализировать составленный функционал? - PullRequest
9 голосов
/ 01 сентября 2010

Это прекрасно работает:

    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 Ответ

10 голосов
/ 01 сентября 2010

То, что происходит во втором случае, заключается в том, что происходит замыкание. Использование func1 внутри func2 создает замыкание для захвата общего состояния между лямбда-выражениями. Закрытия не сериализуемы. Когда вы пытаетесь сериализовать функцию, она пытается сериализовать целевой объект, который является замыканием, и вы получите свое исключение.

...