序列化可以理解为内存对象dump出内存表示,以方便外部的传输存储,比如一个c语言的结构体
typedef struct {
int age;
char name[10];
} Person;这里有一个Person的对象对吧. 我现在要把它传输给接收方.怎么办呢. 一个内存对象怎么能够被传输呢? 因为内存对象有一个特殊性.
- 特定地址:
- 比如我这内存里面是在 0x88888888 位置. 但是对方的内存里面这个地址已经有其它数据了怎么办
- 结构化:
- 比如上面这个对象. 有两个字段. 有可能递归的包含别的对象.
- 对方系统要有此定义才行. 否则无法使用.和初始化
这些都看起来让一个对象无法被传输. 这个时候就可以把一个对象序列化.
序列化, 简单说就是以某种约定的格式把一个内存对象在外部把其信息dump出来并表示和保存起来. 而至于说格式.这个因场景而定. 你可以使用一个string如: “10,张三”这样的字符串来表示这个序列化后的对象的值. 使用这种方式就只保存了值.没有保存结构. 比如10代表什么. 这里表示age 但是序列化后的数据中并没有这个信息. 这种情况下就需要双方约定. 比如这里的逗号前的是年纪.后面是姓名.
如果要同时传输多个对象. 且其结构还不确定. 比如还有一个对象是: Car. 那我要把car和Person一起传输给对方. 那序列化的数据里面必须能够区分哪个对象是哪个数据结构才行.
比如我得到如下的序列化数据:
type:Person|10,张三;type:Car|xxxx这样两个数据都被传输过去了,同时也能区分每一个对象是什么.
你发现没有,序列化后的东西并没有说一定是字节流. 只要你定义好格式能存储必要的信息即可. 同理,也可以使用你这里提到的JSON.
双方只要按照约定把数据序列化为JSON. 对方接收到后再反序列化为内存对象即可.
上面说的内存地址不一样怎么办?
这个其实是多虑了. 我们不会严格要求他们保持一致. 只要能够完成我们的业务需求即可. 两边不必保持地址一致. |