En un WebControl
, tengo una propiedad Filters
define así:¿Hay alguna manera de almacenar un delegado anónimo en un viewstate?
public Dictionary<string, Func<T, bool>> Filters
{
get
{
Dictionary<string, Func<T, bool>> filters =
(Dictionary<string, Func<T, bool>>)ViewState["filters"];
if (filters == null)
{
filters = new Dictionary<string, Func<T, bool>>();
ViewState["filters"] = filters;
}
return filters;
}
}
Este de webcontrol es un DataSource
, creé esta propiedad porque quiero tener la posibilidad de filtrar datos de forma sencilla, por ejemplo:
//in page load
DataSource.Filters.Add("userid", u => u.UserID == 8);
funciona muy bien, sin embargo, si cambio de código para esto:
//in page load
int userId = int.Parse(DdlUsers.SelectedValue);
DataSource.Filters.Add("userid", u => u.UserID == userId);
no Trab KS más, me sale este error:
Tipo System.Web.UI.Page en la Asamblea '...' no está marcado como serializable .
lo que sucedió:
- El serializador inspeccionar el diccionario. Se ve que contiene un delegado anónimo (lambda aquí)
- Dado que el delegado se define en una clase, intenta serializar toda la clase, en este caso System.Web.UI.Página
- Esta clase no está marcada como serializable
- Se produce una excepción debido a 3.
¿hay alguna solución conveniente para resolver esto? No puedo marcar todas las páginas web donde uso el origen de datos como [serializable] por razones obvias.
EDIT 1: algo que no entiendo. Si guardo el Dictionary
en el objeto Session
(que usa un BinaryFormatter
contra LosFormatter
para ViewState
), ¡funciona! No tengo idea de cómo es posible. Tal vez BinaryFormatter
puede serializar cualquier clase, incluso estos que no son [serializable]
?
EDIT 2: código más pequeño para reproducir el problema:
void test()
{
Test test = new Test();
string param1 = "parametertopass";
test.MyEvent +=() => Console.WriteLine(param1);
using (MemoryStream ms = new MemoryStream())
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, test); //bang
}
}
[Serializable]
public class Test
{
public event Action MyEvent;
}
"funciona! No tengo idea de cómo ...": los datos de la sesión permanecen en el servidor, en la memoria. Comenzará a romperse cuando te muevas a más de 2 servidores. –
Gracias por la información – tigrou