文章目录
1. 为什么要使用序列化和反序列化
情况一:
在游戏的开发过程中,策划通常通过Excel表的格式给到程序数值,如果表的数量比较少,程序可以直接读取Excel文件取得表中的值,而如果表的数量非常多,以Excel文件格式存储起来非常大,这是应用软件所不能接受的,并且当我们在项目中使用不同的语言时,程序写的读取Excel文件内容的代码需要改变。
情况二:
当我们在进行前后端通信时,如果我们需要通过网络传输这样一个对象时:
public class Student {
// 姓名
public string name;
// 年龄
public int age;
// 性别
public Sex sex;
// 成绩
public float[] scores;
// 成绩是否合格
public bool isQualified;
public enum Sex {
man,
woman
}
}
我们不能直接传输一个这样的对象,因为前后端的语言不一致,接收方不知道如何解析该对象
2. 什么是序列化和反序列化
2.1 概念
- 序列化:将对象转换为字节序列的过程称为对象的序列化
- 反序列化:将字节序列恢复为对象的过程称为对象的反序列化
2.2 什么情况下使用序列化和反序列化
- 当你想要把内存中的对象状态保存到一个文件中或者数据库中的时候(情况一)
- 当你想要用套接字在网络上传送对象的时候(情况二)
2.3 序列化饭反序列化图解
3. 序列化结果
序列化对象:
Student stu = new Student()
{
name = "ming",
age = 18,
sex = Student.Sex.man,
scores = new float[] {
60.5f ,70f ,80f},
isQualified = true,
};
1.xml
<?xml version="1.0"?>
<Student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<name>ming</name>
<age>18</age>
<sex>man</sex>
<scores>
<float>60.5</float>
<float>70</float>
<float>80</float>
</scores>
<isQualified>true</isQualified>
</Student>
2.json
{
"name":"ming","age":18,"sex":0,"scores":[60.5,70.0,80.0],"isQualified":true}
3.protobuf
0a04 6d69 6e67 1012 2500 0072 4225 0000
8c42 2500 00a0 4228 01
4. xml,json,protobuf 比较
Xml | Json | Protobuf | |
---|---|---|---|
序列化后文件大小 | 大 | 一般 | 小 |