2010-09-01 2 views
8

Это прекрасно работает:Сериализованный состав Func?

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

Сериализация Func к представлению? Извините, но это просто кричит плохой дизайн, и я бы не рекомендовал его. Можете ли вы описать функциональность, которую вы пытаетесь реализовать, может быть, кто-то может предложить лучший подход. – Juliet

ответ

10

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

+0

Хороший ответ! Сегодня я столкнулся с такой же проблемой и смог прикрыть ее до закрытия, см. Мой недавно опубликованный вопрос http://stackoverflow.com/questions/26887460/do-closures-break-serialization. У вас есть официальная ссылка для подтверждения того, что вы здесь указали? Я до сих пор не нашел своего собственного ... – chiccodoro

Смежные вопросы