2010-09-01 4 views
8

Dies funktioniert:Serialize Komponiert Func?

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

Dies ist jedoch nicht der Fall ist:

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

    ViewState["function"] = func2; 

Es hat eine Laufzeit Serialisierung Ausnahme auslöst: Type 'MyProjectName._Default+<>c__DisplayClass3' in Assembly 'MyProjectName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

Jetzt kann ich um diese Zeit arbeiten, aber ich Ich würde gerne verstehen, warum das so ist, damit ich in Zukunft keine andere Wahl habe, als vor der Serialisierung Funktionen zu komponieren, dann habe ich eine Lösung.

+1

Serialisierung eines Func zum Viewstate? Entschuldigung, aber das schreit nur schlechtes Design, und ich würde es nicht empfehlen. Können Sie die Funktionalität beschreiben, die Sie implementieren möchten? Vielleicht kann Ihnen jemand einen besseren Ansatz vorschlagen. – Juliet

Antwort

10

Was im zweiten Fall passiert ist, dass eine Schließung beteiligt ist. Die Verwendung von func1 innerhalb von func2 erzeugt eine Schließung, um den gemeinsamen Zustand zwischen den Lambda-Ausdrücken zu erfassen. Verschlüsse sind nicht serialisierbar. Wenn Sie versuchen, die Funktion serialisieren, versucht es, das Zielobjekt zu serialisieren, das die Schließung ist, und Sie erhalten Ihre Ausnahme.

+0

Gute Antwort! Ich war heute mit dem gleichen Problem konfrontiert und konnte es zu Schließungen bringen, siehe meine neu veröffentlichte Frage http://stackoverflow.com/questions/26887460/doclosures-break-serialization. Haben Sie eine offizielle Referenz, um zu bestätigen, was Sie hier angegeben haben? Ich habe bis jetzt noch niemanden gefunden ... – chiccodoro