W WebControl
, mam właściwość Filters
zdefiniowane tak:Czy istnieje sposób przechowywania anonimowego uczestnika w stanie widoku?
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;
}
}
Ten WebControl jest DataSource
, stworzyłem tę właściwość, ponieważ chcę mieć możliwośc filtrować dane łatwo, np
//in page load
DataSource.Filters.Add("userid", u => u.UserID == 8);
działa świetnie, jednak w przypadku zmiany kodu do tego:
//in page load
int userId = int.Parse(DdlUsers.SelectedValue);
DataSource.Filters.Add("userid", u => u.UserID == userId);
nie Wor ks już, otrzymuję ten błąd:
Wpisz System.Web.UI.Page w zestawie "..." nie jest oznaczony jako z możliwością serializowania.
Co się stało:
- The serializatora skontrolować słownika. Widzi, że zawiera anonimowego delegata (lambda).
- Ponieważ delegat jest zdefiniowany w klasie, próbuje serializować całą klasę, w tym przypadku System.Web.UI.Page
- Ta klasa nie jest oznaczona jako serializable
- zgłasza wyjątek ze względu 3.
Czy istnieje wygodne rozwiązanie aby rozwiązać ten problem? Nie mogę oznaczyć wszystkich stron internetowych, z których korzystam ze źródła danych jako [serializowalne] z oczywistych powodów.
EDIT 1: coś, czego nie rozumiem. Jeśli przechowuję obiekt Dictionary
w obiekcie Session
(który używa BinaryFormatter
vs LosFormatter
dla ViewState
), działa! Nie mam pojęcia, jak to jest możliwe. Może BinaryFormatter
może serializować dowolne zajęcia, nawet te, które nie są [serializable]
?
EDIT 2: najmniejsza kod do odtworzenia problemu:
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;
}
"Działa, nie mam pojęcia jak ...": dane sesji pozostają po stronie serwera, w pamięci. Zacznie się łamać po przejściu na 2 serwery. –
thx za informacje – tigrou