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#程序设计有所帮助。