2010-09-01 9 views
8

Działa to dobrze:Serialize Composed Func?

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

Jednak to nie:

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

    ViewState["function"] = func2; 

on zgłasza wyjątek środowiska wykonawczego serializacji: Type 'MyProjectName._Default+<>c__DisplayClass3' in Assembly 'MyProjectName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

Teraz mogę obejść ten czas, ale ja "Chciałbym zrozumieć, dlaczego tak się dzieje, że jeśli w przyszłości nie będę miał innego wyboru niż komponowanie funkcji przed serializacją, będę miał rozwiązanie.

+1

Serializowanie Func do stanu widoku? Przepraszam, ale to tylko krzyczy zły projekt i nie polecam go. Czy możesz opisać funkcjonalność, którą próbujesz wdrożyć, może ktoś może zaproponować lepsze podejście. – Juliet

Odpowiedz

10

To, co dzieje się w drugim przypadku, dotyczy zamknięcia. Użycie obiektu func1 wewnątrz func2 tworzy zamknięcie przechwytywania stanu współdzielonego między wyrażeniami lambda. Zamknięcia nie podlegają przekształcaniu do postaci szeregowej. Kiedy spróbujesz serializować func, spróbujesz serializować obiekt docelowy, który jest zamknięciem i otrzymasz wyjątek.

+0

Dobra odpowiedź! Zmierzyłem się z tym samym problemem już dziś i udało mi się go przyblokować do zamknięć, zobacz moje niedawno opublikowane pytanie http://stackoverflow.com/questions/26887460/do-closures-break-serialization. Czy masz jakieś oficjalne referencje, aby potwierdzić to, co tutaj napisałeś? Nie znalazłem dotąd żadnych własnych ... – chiccodoro