У меня есть решение, которое вам все еще нужно адаптировать к вашей ситуации, потому что в этом образце хранятся все состояния элемента управления, а также свойства, установленные средой выполнения asp.net. Помните, что Serializable не может быть установлен для свойства поля, только для класса / структуры. Однако вы можете создать свой собственный атрибут (ViewStateSerializable?), Который вы используете для оформления свойств, которые вы хотите сохранить во время обратных передач. Помните, что viewstate переходит к клиенту через провод, поэтому, если у вас его много, пользователи могут расстроиться ....
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);
}