[Serializable] public class BaseObject { [OptionalField] private string _str = "I am BaseObject"; }
[Serializable] public class TestObject : BaseObject, ISerializable
{ int a;
string strName = "";
Color c = Color.Red;
DataTable _dtColors = null;
[OptionalField] ArrayList list = new ArrayList();
[OptionalField] List<int> list1 = new List<int>();
[OptionalField] Dictionary<int, string> dic = new Dictionary<int, string>();
//当实现ISerializable接口时,如果该构造函数不存在,则会引发一个SerializationException异常
//该特性表示,该方法只允许序列化器调
[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)] protected TestObject(SerializationInfo info, StreamingContext context) {
#region 如果基类也实现了ISerializable接口,则序列化器会自动调用基类的该构造函数,就不需要本段代码
Type basetype = this.GetType().BaseType; MemberInfo[] mi = FormatterServices.GetSerializableMembers(basetype, context);
for (int i = 0; i < mi.Length; i++) { //由于AddValue不能添加重名值,为了避免子类变量名与基类变量名相同,将基类序列化的变量名加上基类类名 FieldInfo fi = (FieldInfo)mi[0]; object objValue = info.GetValue(basetype.FullName + "+" + fi.Name, fi.FieldType); fi.SetValue(this, objValue); }
#endregion
a = info.GetInt32("a"); strName = info.GetString("strName"); c = (Color)info.GetValue("c", typeof(Color)); _dtColors = (DataTable)info.GetValue("_dtColors", typeof(DataTable)); list = (ArrayList)info.GetValue("list", typeof(ArrayList)); list1 = (List<int>)info.GetValue("list1", typeof(List<int>)); dic = (Dictionary<int, string>)info.GetValue("dic", typeof(Dictionary<int, string>)); }
public TestObject() { a = 100; strName = "daps";
InitColorTable();
list1.Add(10); list1.Add(20);
}
#region ISerializable 成员
[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter =true)] void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue("a", a); info.AddValue("strName", strName); info.AddValue("c", c); info.AddValue("_dtColors", _dtColors); info.AddValue("list", list); info.AddValue("list1", list1); info.AddValue("dic", dic);
Type basetype = this.GetType().BaseType; MemberInfo[] mi = FormatterServices.GetSerializableMembers(basetype, context);
for (int i = 0; i < mi.Length; i++) { //由于AddValue不能添加重名值,为了避免子类变量名与基类变量名相同,将基类序列化的变量名加上基类类名 info.AddValue(basetype.FullName + "+" + mi[i].Name, ((FieldInfo)mi[i]).GetValue(this)); } }
#endregion }