嘿嘿,学习啦序列化

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

           一.序列化

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

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

          序列化的命名空间: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类,而他们要实现序列化的方法都是要添加一个可序列化的标识,仅此而已,我们在实现序列化时间一定要注意添加标识即可,然后即可实现其序列化与反序列化。

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