在WebControl
,我有一个属性Filters
这样定义:有没有办法在视图状态下存储匿名代理?
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;
}
}
这夏精是DataSource
,我因为我希望有方法可行容易地过滤数据,例如,创建该属性:
//in page load
DataSource.Filters.Add("userid", u => u.UserID == 8);
它的伟大工程,但是,如果我改变代码如下:
//in page load
int userId = int.Parse(DdlUsers.SelectedValue);
DataSource.Filters.Add("userid", u => u.UserID == userId);
它不活像Ks了,我得到这个错误:
类型System.Web.UI.Page在程序集'...'中没有标记为 可序列化。
发生了什么事:
- 串行器检查字典。它认为它包含由于委托类中定义一个匿名委托(拉姆达这里)
- ,它尝试序列全班,在这种情况下System.Web.UI.Page
- 该类没有标记为序列化
- 它抛出,因为3
异常是否有方便的解决方案来解决这个?由于显而易见的原因,我无法将所有使用数据源的网页标记为[serializable]。
编辑1:东西我不明白。如果我将Dictionary
存储在Session
对象中(它使用BinaryFormatter
和LosFormatter
代替ViewState
),它可以工作!我不知道它是如何可能的。也许BinaryFormatter
可以序列化任何类,即使这些谁不是[serializable]
?
编辑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;
}
“它的工作原理!我不知道如何...”:会话数据仍然是服务器端,内存中。当您移动到2台服务器时,它将开始中断。 –
thx的信息 – tigrou