對象序列化與反序列化 深層拷貝

2012年4月11日   天氣 有雨   真正的春雨來了,雖然下雨,不像上個月的雨期了,心情不錯!

今天看了一下序列化的問題,感覺挺神奇的,代碼如下:

        //序列化與反序列化
        //序列化 就是可以 把你建的一個對象有文件保存起來
        //比如說你把建好的list<string>存了很多值,但程序關閉了,值就不存在了,你想用文件保存起來,下次再用
        //或者把你的對象通過socket發給另外一個程序調用
        //反序列化把你序列化的文件流轉換成對象,以便調用
        //序列化
        static void simple6_1()
        {
            List<string> list = new List<string>();
            list.Add("zhangfeng is a SB!");
            list.Add("SB have many");
            list.Add("SB is smiling");//新建一list對象 並添加值
            BinaryFormatter fb = new BinaryFormatter();//創建一個序列化對象
            using (FileStream fs = new FileStream("c:\\a.dat",FileMode.Create))
            {
                fb.Serialize(fs, list);//對象序列化
            }
        }
        //反序列化
        static void simple6_2()//在asp.net 中  viewState 和session  可能用到
        {
            BinaryFormatter fb = new BinaryFormatter();
            using (FileStream fs = new FileStream("c:\\a.dat", FileMode.Open))
            {
                object obj= fb.Deserialize(fs);//對象反序列化
                List<string> list = (List<string>)obj;
                foreach (string s in list)
                {
                    Console.WriteLine(s);//輸出
                }
            }
        }
        //複雜序列化
        //複雜在哪呢,就是自建一個對象,對象中一個屬性是自己類的對象,序列化一個對象後,怎樣保存他指向的對象的值
        //這裏面序列化一個對象,其實保存了兩個對象的值
        static void simple7_1()
        {
            person p1 = new person();
            p1.ID = 1;
            p1.Name = "老布什";
            p1.Age = 50;

            person p2 = new person();
            p2.ID = 2;
            p2.Name = "小布什";
            p2.Age = 20;
            p2.parent = p1;

            

            BinaryFormatter fb = new BinaryFormatter();//創建一個序列化對象
            using (FileStream fs = new FileStream("c:\\a.dat", FileMode.Create))
            {
                fb.Serialize(fs, p2);//對象序列化
            }
        }
        static void simple7_2()
        {
            BinaryFormatter fb = new BinaryFormatter();
            using (FileStream fs = new FileStream("c:\\a.dat", FileMode.Open))
            {
                object obj = fb.Deserialize(fs);//對象反序列化
                person p = (person)obj;
                Console.WriteLine(p.parent.Name);//輸出老布什
            }
        }
        //對象序列化的應用  深層拷貝
        static object DeepCopy(object src)
        {
            BinaryFormatter bf = new BinaryFormatter(null, new System.Runtime.Serialization.StreamingContext(StreamingContextStates.Clone));
            using (MemoryStream stream = new MemoryStream())
            {
                bf.Serialize(stream, src);
                stream.Position = 0;
                return bf.Deserialize(stream);
            }
        }
        //深層拷貝調用
        //爲什麼我們要用到深層拷貝,因爲有時候建了一個對象  想要更改  又想保存原來的值  普通拷貝  只是淺層拷貝
        static void simple8()
        {
            person p1 = new person();
            p1.ID = 1;
            p1.Name = "老布什";
            p1.Age = 50;

            person p2 = new person();
            p2.ID = 2;
            p2.Name = "小布什";
            p2.Age = 20;
            p2.parent = p1;

            person p = (person)DeepCopy(p2);
            Console.WriteLine(p.parent.Name);//輸出老布什
        }

//類定義:

    [Serializable]//標記  標記是可以序列化,不是每個對象都可以序列化的,自寫的要標記可序列化
    class person
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public person parent { get; set; }
    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章