嘿嘿,学习啦序列化

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

一.序列化

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

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

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

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

时间: 2024-12-23 03:51:28

嘿嘿,学习啦序列化的相关文章

.net学习笔记--序列化与反序列化

序列化其实就是将一个对象的所有相关的数据保存为一个二进制文件(注意:是一个对象) 而且与这个对象相关的所有类型都必须是可序列化的所以要在相关类中加上 [Serializable]特性 对象类型包括:对象本神包含的类型,父类 拥有需要的对象之后:1.将对象转换为二进制数据 使用专门的对像进行转换 BinaryFormatter 2.将二进制数据写入到文件 FileSteam 反序列化则是把二进制文件转换为一个对象 例子代码如下: 1 using System; 2 using System.Col

【JAVA学习】序列化与反序列化

尊重原创:http://zhidao.baidu.com/question/155071231.html?fr=qrl&cid=870&index=1 1.序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存Object States,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化. 2.什么情况下需要序列化 a)当你想把的内存中的对象保存到一个文件中或者数据库中时候: b)当你

深入学习 Java 序列化

深入学习 Java 序列化 来源  http://www.importnew.com/24490.html 原文 http://beautyboss.farbox.com/post/study/shen-ru-xue-xi-javaxu-lie-hua 前言 对于Java的序列化,一直只知道只需要实现Serializbale这个接口就可以了,具体内部实现一直不是很了解,正好这次在重复造RPC的轮子的时候涉及到序列化问题,就抽时间看了下 Java序列化的底层实现,这篇文章算是这次的学习小结吧. 第

深入学习Java序列化

前言 对于Java的序列化,一直只知道只需要实现Serializbale这个接口就可以了,具体内部实现一直不是很了解,正好这次在重复造RPC的轮子的时候涉及到序列化问题,就抽时间看了下 Java序列化的底层实现,这篇文章算是这次的学习小结吧. 第一部分:What Java序列化是指把Java对象保存为二进制字节码的过程,Java反序列化是指把二进制码重新转换成Java对象的过程. 那么为什么需要序列化呢? 第一种情况是:一般情况下Java对象的声明周期都比Java虚拟机的要短,实际应用中我们希望

Java学习笔记——序列化和反序列化

寒雨连江夜入吴,平明送客楚山孤. 洛阳亲友如相问,一片冰心在玉壶. --芙蓉楼送辛渐 持久化数据的第一种方式.在序列化之前也可以把数据打散逐行存储在文件中,然后在逐行读取. 比如定Student类 用字符输出流把Student类的所有属性存入本地文件: 张三|18|男 李四|18|女 读取一行,用|分隔的数据分别为学生的name,age,gender,创建学生对象并加入学生集合 循环上一步直到br.readLine = null 至于这种方法怎么存储对象的其他信息那就不清楚了. 下面来看序列化

python3学习之序列化

其他-->字符串,叫序列化 字符串-->其他,叫反序列化 有两个模块: json   可以处理python基本数据类型,字典,列表,元组,保存的文件是"明文的" pickle 可以处理python全部数据类型,专用于python,保存的文件是"加密的" json import json l = '{"a":123,"b":234}' ll = json.loads(l)   #从变量加载字符串转为词典:json格式

python学习笔记 序列化

在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict: d = dict(name='Bob', age=20, score=88) 可以随时修改变量,比如把name改成'Bill',但是一旦程序结束,变量所占用的内存就被操作系统全部回收.如果没有把修改后的'Bill'存储到磁盘上,下次重新运行程序,变量又被初始化为'Bob'. 我们把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshal

Json.Net学习.集合序列化.

只要集合实现了IEnumable接口就可以进行序列化 Json序列化器为序列化及反序列化集合对象提供了良好的支持. ->Serializing 为了序列化一个集合---一个泛型的list,array,dictionary,或者自定义集合---简单地调用序列化器,使用您想要进行序列化的集合对象作为参数,Json.Net会序列化集合以及所有它包含的值. 示例: public class Product { public string Name { get; set; } public decimal

Java学习之序列化

Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据.有关对象的类型的信息和存储在对象中数据的类型. 将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息.对象的数据,还有对象中的数据类型可以用来在内存中新建对象. 整个过程都是Java虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象. 类ObjectInputStream 和ObjectOutpu