|
那么再把这个类放入ViewState的话就会报错:此页的状态信息无效,可能已损坏,主要是因为它的父类DataTable中的DataRow和DataColumn等是不可序列化的,我们就需要把这个类改造成如下形式:
[SerializableAttribute] class Test : DataTable, System.Runtime.Serialization.ISerializable { public Test() { DataColumn col = new DataColumn(); col.DataType = typeof(string); col.ColumnName = "name"; this.Columns.Add(col); } public object this[int index] { get { if (index >= Rows.Count) { return null; } return Rows[index]["name"]; } set { DataRow row = NewRow(); row["name"] = value; Rows.Add(row); } } public Test(SerializationInfo info, StreamingContext context) { DataColumn col = new DataColumn(); col.DataType = typeof(string); col.ColumnName = "name"; this.Columns.Add(col); ArrayList list = info.GetValue("list", typeof(ArrayList)) as ArrayList; foreach (string value in list) { DataRow row = NewRow(); row["name"] = value; Rows.Add(row); } } public void GetObjectData(SerializationInfo info, StreamingContext context) { ArrayList list = new ArrayList(); foreach (DataRow row in this.Rows) { list.Add(row["name"]); } info.AddValue("list", list); } }
1、实现ISerializable接口
2、实现GetObjectData方法,这个方法中就是把要序列化的对象放入info中,特别注意放入info中的对象本身必须是可以序列化的,如果放入一个DataRow对象,就会报错:未标记为可序列化
3、实现public Test(SerializationInfo info, StreamingContext context) 构造函数,这个函数就是一个反序列化的操作,把info中的对象取出来
经过上面的改造之后,就可以把这个Test对象放入ViewState中了
|