自定义序列化 ISerializable 的实现

    技术2022-05-20  48

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


    最新回复(0)