C#自定義序列化 ISerializable 的實現的代碼

將開發過程中經常用的內容段收藏起來,如下的資料是關於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>();


        [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++)
            {
                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++)
            {
                info.AddValue(basetype.FullName + "+" + mi[i].Name, ((FieldInfo)mi[i]).GetValue(this));
            }
        }
        #endregion
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章