zoukankan      html  css  js  c++  java
  • 嘿嘿,学习啦序列化

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

               一.序列化

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

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

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

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

    我是小白,新建立了一个的群:461431726,希望在这里和大家一起交流,共同学习。前端的话建议加群:646564351,谢谢
  • 相关阅读:
    ThreadLocal
    mysql
    heroku 的用法
    Redis
    disruptor
    RxJava
    TCP
    虚拟机的安装及配置等
    k8s
    Ribbon源
  • 原文地址:https://www.cnblogs.com/dyxd/p/4166208.html
Copyright © 2011-2022 走看看