序列化与反序列化

背景:

1、在TCP/UDP连接上,它传输数据的基本形式就是二进制流,也就是一段一段的1和0。

2、在一般编程语言或者网络框架提供的API中,传输数据的基本形式是字节,也就是Byte。一个字节就是8个二进制位,8个Bit。

3、二进制流和字节流本质上是一样的。对于我们编写的程序来说,它需要通过网络传输的数据是结构化的数据,比如,一条命令、一段文本或者一条消息。对应代码中,这些结构化的数据都可以用一个类或者一个结构体来表示。

问题

一个对象定义如下:

name: 姓名
age: 年龄
languages: 熟悉的编程语言, 普通数组方式,比如["C++", "Linux"],
phone: 电话号码,是嵌套的对象,包含number和type, 
	"number":   "18570368134",
	"type"  :   "home
books: 对象数组方式,可以包含多本书信息, 每本书包含name和price属性。
vip: 是否为vip
address: 地址

在内存里存放的任何数据和网络通讯中传输的数据,它最基础的存储单元也是二进制比特,也就是说,我们应用程序操作的对象,它在内存中也是使用二进制存储的,既然都是二进制,为什么不能直接把内存中对象对应的二进制数据直接通过网络发送出去,或者保存在文件中呢?为什么还需要序列化和反序列化呢?

  • 内存里存的东西,不通用, 不同系统, 不同语言的组织可能都是不一样的, 而且还存在很多引用,指针,并不是直接数据块。内存中的对象数据应该具有语言独特性,例如表达相同业务的User对象(id/name/age字段),Java和PHP在内存中的数据格式应该不一样的,如果直接用内存中的数据,可能会造成语言不通。只要对序列化的数据格式进行了协商,任何2个语言直接都可以进行序列化传输、接收。
  • 一个数据结构,里面存储的数据是经过非常多其他数据通过非常复杂的算法生成的,因为数据量非常大,因此生成该数据结构所用数据的时间可能要非常久,生成该数据结构后又要用作其他的计算,那么你在调试阶段,每次执行个程序,就光生成数据结构就要花上这么长的时间。假设你确定生成数据结构的算法不会变或不常变,那么就能够通过序列化技术生成数据结构数据存储到磁盘上,下次又一次执行程序时仅仅须要从磁盘上读取该对象数据就可以,所花费时间也就读一个文件的时间
  • 虽然都是二进制的数据,但是序列化的二进制数据是通过一定的协议将数据字段进行拼接。
    • 第一个优势是:不同的语言都可以遵循这种协议进行解析,实现了跨语言。
    • 第二个优势是:这种数据可以直接持久化到磁盘,从磁盘读取后也可以通过这个协议解析出来。

序列化和反序列化

序列化和反序列化概念

实现结构化的数据与字节流之间的双向转换。这种将结构化数据转换成字节流的过程,称为序列化,反过来转换,就是反序列化。

  • 序列化:把对象转换为字节序列的过程称为对象的序列化。
  • 反序列化:把字节序列恢复为对象的过程称为对象的反序列化。

简单来说,序列化就是将对象实例的状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它依据流重构对象。这两个过程结合起来,能够轻松地存储和数据传输。比如,能够序列化一个对象,然后使用HTTP 通过 Internet 在client和server之间传输该对象。

在这里插入图片描述

什么情况下需要序列化

  • 当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
  • 当你想用套接字在网络上传送对象的时候。

如何实现序列化与反序列化?

  • Java和Go语言都内置了序列化实现

  • 也有一些流行的开源序列化实现,比如,Googel的Protobuf、Kryo、Hessian等;

  • 此外,像JSON、XML这些标准的数据格式,也可以作为一种序列化实现来使用。

  • 当然,也可以自己来实现私有的序列化实现。

参考文章

参考文章:https://www.cnblogs.com/chjxbt/p/11458815.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值