手机
当前位置:查字典教程网 >编程开发 >C#教程 >C#自定义序列化ISerializable的实现方法
C#自定义序列化ISerializable的实现方法
摘要:本文实例讲述了C#自定义序列化ISerializable的实现方法。分享给大家供大家参考。具体实现方法如下:[Serializable]pu...

本文实例讲述了C#自定义序列化ISerializable的实现方法。分享给大家供大家参考。具体实现方法如下:

[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 }

希望本文所述对大家的C#程序设计有所帮助。

【C#自定义序列化ISerializable的实现方法】相关文章:

C# 获取属性名的方法

C#技巧之快速删除bin和obj文件夹的方法

共享锁using范围的实现方法

c#生成缩略图的实现方法

关于C#生成MongoDB中ObjectId的实现方法

c# 重载WndProc,实现重写“最小化”的实现方法

C# 鼠标穿透窗体功能的实现方法

深入线程安全容器的实现方法

基于反射解决类复制的实现方法

C# SendInput 模拟鼠标操作的实现方法

精品推荐
分类导航