In einem WebControl
, habe ich eine Eigenschaft Filters
wie folgt definiert:Gibt es eine Möglichkeit, einen anonymen Delegaten in einem Viewstate zu speichern?
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;
}
}
Diese webcontrol ist ein DataSource
, ich diese Eigenschaft erstellt, weil ich die Möglichkeit haben will, einfach Daten zu filtern, zB:
//in page load
DataSource.Filters.Add("userid", u => u.UserID == 8);
Es funktioniert großartig, aber wenn ich Code dies zu ändern:
//in page load
int userId = int.Parse(DdlUsers.SelectedValue);
DataSource.Filters.Add("userid", u => u.UserID == userId);
wor Es ist nicht ks mehr, ich diesen Fehler:
Typ System.Web.UI.Page in Assembly '...' ist nicht markiert als serializable.
Was ist passiert:
- Der Serializer inspizieren das Wörterbuch. Es sieht, dass es einen anonymen Delegaten enthält (hier Lambda)
- Da der Delegat in einer Klasse definiert ist, versucht er die gesamte Klasse zu serialisieren, in diesem Fall System.Web.UI.Page
- Diese Klasse ist nicht als markiert Serializable
- Es wirft eine Ausnahme, weil der 3.
gibt es eine bequeme Lösung, dieses Problem zu lösen? Ich kann nicht alle Webseiten markieren, wo ich die Datenquelle aus offensichtlichen Gründen als [serialisierbar] benutze.
EDIT 1: etwas, das ich nicht verstehe. Wenn ich das Dictionary
im Objekt Session
(das eine BinaryFormatter
vs LosFormatter
für ViewState
verwenden) speichern, funktioniert es! Ich habe keine Ahnung, wie es möglich ist. Vielleicht BinaryFormatter
kann jede Klasse serialisieren, auch diese, die nicht [serializable]
sind?
EDIT 2:
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;
}
"es funktioniert! Ich habe keine Ahnung wie ...": Sitzungsdaten bleiben serverseitig, im Speicher. Es wird zu brechen beginnen, wenn Sie zu 2 Servern wechseln. –
thx für die info – tigrou