では、次のように定義され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;
}
}
この Web コントロールは です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);
もう機能しません。次のエラーが表示されます。
アセンブリ '...' の System.Web.UI.Page 型は、シリアル化可能としてマークされていません。
どうしたの :
- シリアライザはディクショナリを検査します。匿名のデリゲート (ここではラムダ) が含まれていることがわかります
- デリゲートはクラスで定義されているため、クラス全体 (この場合は System.Web.UI.Page) をシリアル化しようとします。
- このクラスはシリアライズ可能としてマークされていません
- 3のため、例外がスローされます。
これを解決する便利な解決策はありますか? 明らかな理由により、データソースを使用するすべての Web ページを [シリアル化可能] としてマークすることはできません。
EDIT 1 :私が理解していないもの。をオブジェクト(vs forを使用)に保存するDictionary
と、機能します!どうすればそれが可能かわかりません。たぶん、そうでない人でも、どのクラスでもシリアライズできますか?Session
BinaryFormatter
LosFormatter
ViewState
BinaryFormatter
[serializable]
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;
}