このサンプルでは、コントロールのすべての状態、asp.netランタイムによって設定されたプロパティも保存されるため、状況に合わせて調整する必要があるソリューションがあります。 Serializableは、フィールドのプロパティでは設定できません。クラス/構造体のみです。ただし、ポストバック時に保持するプロパティを装飾するために使用する独自の属性(ViewStateSerializable?)を作成することはできます。ビューステートがクライアントに接続されていることを覚えておいてください。多くの場合、ユーザーは動揺するかもしれません....
protected override object SaveViewState()
{
Dictionary<string, object > dict = new Dictionary<string, object>();
foreach (var prop in this.GetType().GetProperties())
{
// here we decide what to save
if (prop.PropertyType.GetCustomAttributes(
typeof(SerializableAttribute), false).Length>0)
{
dict.Add(prop.Name, prop.GetValue(this, new object[] {}));
}
}
var ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, dict);
return ms.ToArray();
}
protected override void LoadViewState(object savedState)
{
BinaryFormatter bf = new BinaryFormatter();
Dictionary<string, object> dict =
(Dictionary<string, object>) bf.Deserialize(
new MemoryStream((byte[])savedState));
foreach(var kv in dict)
{
this.GetType()
.GetProperty(kv.Key)
.SetValue(this, kv.Value, new object[] {});
}
base.LoadViewState(savedState);
}