2010-09-01 34 views
8

Esto funciona bien:Serialize Composed Func?

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

Sin embargo, esto no quiere:

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

    ViewState["function"] = func2; 

Se produce una excepción de tiempo de ejecución de serialización: Type 'MyProjectName._Default+<>c__DisplayClass3' in Assembly 'MyProjectName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

Ahora, puedo solucionar este este tiempo, pero Me gustaría entender por qué sucede esto, de modo que si, en el futuro, no tengo más remedio que componer funciones antes de la serialización, tendré una solución.

+1

¿Serializar un Func al viewstate? Lo siento pero eso solo grita mal diseño, y no lo recomendaría. ¿Puede describir la funcionalidad que intenta implementar, tal vez alguien puede sugerir un mejor enfoque? – Juliet

Respuesta

10

Lo que está sucediendo en el segundo caso es que se trata de un cierre. El uso de func1 dentro de func2 crea un cierre para capturar el estado compartido entre las expresiones lambdas. Los cierres no son serializables. Cuando intentas serializar el func, trata de serializar el objeto objetivo que es el cierre y obtienes tu excepción.

+0

¡Buena respuesta! Enfrenté el mismo problema hoy y pude bloquearlo para cerrar, vea mi pregunta recientemente publicada http://stackoverflow.com/questions/26887460/do-closures-break-serialization. ¿Tiene alguna referencia oficial para confirmar lo que declaró aquí? No he encontrado ninguno hasta ahora solo ... – chiccodoro