C#自定义序列化ISerializable的实现方法
本文实例讲述了C#自定义序列化ISerializable的实现方法。分享给大家供大家参考。具体实现方法如下:
[Serializable] publicclassBaseObject { [OptionalField] privatestring_str="IamBaseObject"; } [Serializable] publicclassTestObject:BaseObject,ISerializable { inta; stringstrName=""; Colorc=Color.Red; DataTable_dtColors=null; [OptionalField] ArrayListlist=newArrayList(); [OptionalField] List<int>list1=newList<int>(); [OptionalField] Dictionary<int,string>dic=newDictionary<int,string>(); //当实现ISerializable接口时,如果该构造函数不存在,则会引发一个SerializationException异常 //该特性表示,该方法只允许序列化器调 [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] protectedTestObject(SerializationInfoinfo,StreamingContextcontext) { #region如果基类也实现了ISerializable接口,则序列化器会自动调用基类的该构造函数,就不需要本段代码 Typebasetype=this.GetType().BaseType; MemberInfo[]mi=FormatterServices.GetSerializableMembers(basetype,context); for(inti=0;i<mi.Length;i++) { //由于AddValue不能添加重名值,为了避免子类变量名与基类变量名相同,将基类序列化的变量名加上基类类名 FieldInfofi=(FieldInfo)mi[0]; objectobjValue=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>)); } publicTestObject() { a=100; strName="daps"; InitColorTable(); list1.Add(10); list1.Add(20); } #regionISerializable成员 [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] voidISerializable.GetObjectData(SerializationInfoinfo,StreamingContextcontext) { 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); Typebasetype=this.GetType().BaseType; MemberInfo[]mi=FormatterServices.GetSerializableMembers(basetype,context); for(inti=0;i<mi.Length;i++) { //由于AddValue不能添加重名值,为了避免子类变量名与基类变量名相同,将基类序列化的变量名加上基类类名 info.AddValue(basetype.FullName+"+"+mi[i].Name,((FieldInfo)mi[i]).GetValue(this)); } } #endregion }
希望本文所述对大家的C#程序设计有所帮助。