首页 > 代码库 > 嘿嘿,学习啦序列化

嘿嘿,学习啦序列化

                 嘿嘿,不论发生什么的情况,学校没有老师上课也好,我们都要自己主动地学习啦,学习是不能落下的啦,虽然我们这周没有老师给我们上课,但是我们只有自己学习啦,还记得前几天,老是简单的说啦下序列化,那时间也只是简单的听啦一下大概的内容,只知道需要一个关键字啦,今天没有上课也就没有什么新的知识总结啦,那么我就自己寻找些自己想知道的啦,下面详细的总结下序列化与反序列化啦。

           一.序列化

          序列化:就是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

          序列化的应用:将对象持久化存储,磁盘、数据库;将对象复制到剪贴板;将对象通过网络传输;将对象备份(深拷贝。)

          序列化的命名空间:using System.Runtime.Serialization.Formatters.Binary;

          下面就先使用List泛型举例简单的说一下:

            List<int> list = new List<int>();   //list泛型               list.Add(1);            list.Add(2);            list.Add(3);            using (FileStream fs = new FileStream("data.txt", FileMode.Create))  //当创建文件时间使用Create            {                BinaryFormatter bf = new BinaryFormatter();                bf.Serialize(fs, list);   //在这里就是序列化的方法,把对象转化成二进制的形式通过流保存在文件中            }

 

                   在这里我们利用List<int>  创建了一个序列化,而在这里为什么可以序列化那,主要是因为List是一个可序列化类,而可序列化类的标识是什么那?就是在类的前面添加一个[Serializable]即可,下面我们就写一个反序列化的模式,当然,反序列化是在序列化存在的情况下才能创建,因此在这里需要注意啦。
                if (File.Exists("data.txt"))   //当反序列化时间首先判断文件是否存在                using (FileStream fs = new FileStream("data.txt", FileMode.Open))                {                    BinaryFormatter bf = new BinaryFormatter();                    List<int> list = bf.Deserialize(fs) as List<int>;        //在这里需要注意,我们序列化进去的是一个什么类型,那么我们反序列回来的就是什么类型,而bf.Deserialize(fs)返回的本是一个object类型,所以转换为list<int>类型                    //通过流读文件把流中的内容反序列化成对象                    for (int i = 0; i < list.Count; i++)                    {                        Console.WriteLine(list[i]);    //遍历出每一项                    }                }

 

                 这里就是我们反序列化的创建啦,我们可以看到上面的第一行代码,在这里我们要注意啦,在反序列化前,一定要判断我们序列化的文件是否存在,在存在的情况下,我们可以反序列化啦,我们序列化时间使用的方法是Serialize,而在反序列化时间调用的是Deserialize方法,还有我们在反序列化时间要注意类型的转化啦,这个是非常重要的啦。

                 下面就写一个自己定义的类,在这个类中可以有继承,然后让其序列化与反序列化啦。

                 首先定义一个Student类,在定义一个Person类与Dog类,Person为父类,Student为子类,继承父类Person类,而Dog仅仅为Student的一个属性,下面让其序列化与反序列化一下。

[Serializable]    class Person                                  {        private int age;        public int Age        {            get { return age; }            set { age = value; }        }    }
[Serializable]    class Student :Person    {        private string name;        public string Name        {            get { return name; }            set { name = value; }        }        private Dog dog;        internal Dog Dog        {            get { return dog; }            set { dog = value; }        }        public void SayHi()        {            Console.WriteLine(this.name);        }    }
[Serializable]    class Dog    {        private string name;        public string Name        {            get { return name; }            set { name = value; }        }    }}

               

           上面是定义的三个类,实现了继承方法,在这里需要注意的是:序列化不会通过继承关系而继承,因此,当无论是Student类还是Person任何一个类要序列化,那么他们都要序列化,而Student中的属性类在这里也是必须实现可序列化的,这里是容易出错的地方,我们要更加的注意的啦。

           下面就写一下实现序列化和反序列化的方法,

 #region 自定义一个可序列化的类            Student s = new Student();            s.Name = "zhangsan";            s.Dog = new Dog();   //在这里是因为定义啦一个Dog的类,而把Dog这个类作为Student的其中一个属性            s.Dog.Name = "xiaogou";            using (FileStream fs = new FileStream("a.txt", FileMode.Create))            {                BinaryFormatter bf = new BinaryFormatter();                bf.Serialize(fs, s);            }            #endregion
 #region 自定义反序列化            if (File.Exists("a.txt"))            {                using (FileStream fs = new FileStream("a.txt", FileMode.Open))                {                    BinaryFormatter bf = new BinaryFormatter();                    Student s= bf.Deserialize(fs) as Student;                    s.Dog.Name = "xiaogou";                    s.SayHi();                    Console.WriteLine(s.Dog.Name);                 }            }            #endregion

 

                 通过上面的方法对比,一个是系统定义好的List类,一个是我们自己定义的可序列化的Person,Student与Student的属性Dog类,而他们要实现序列化的方法都是要添加一个可序列化的标识,仅此而已,我们在实现序列化时间一定要注意添加标识即可,然后即可实现其序列化与反序列化。

          嘿嘿,我终于知道啦序列化与反序列化啦,虽然仅仅认识啦而已,但是还是蛮高兴的啦,据说序列化好难得啊,但是这还是简单的初步认识而已,我还是会继续学习这个的啦,嘿嘿,努力喽。

嘿嘿,学习啦序列化