【序列化】的一些基础知识

简介: 【序列化】的一些基础知识

1. 序列化的概念

   在Java应用中,所有对象的创建都是在内存中完成的,当应用需要保存对象到磁盘文件或通过网络发送给其他应用时,需要将对象信息转化成二进制字节流,这个从对象状态转化成二进制字节流的过程,就是序列化。相反,从字节流创建成对象的过程就是反序列化。

  • 序列化:将数据结构或对象转换成二进制字节流的过程
  • 序列化:将在序列化过程中所生成的二进制字节流转换成数据结构或者对象的过程

2. 序列化框架优劣的评判

  • 通用性:是否支持跨语言、跨平台;
  • 性能:空间和时间的开销,序列化后的数据大小常常影响着后续的传输和存储性能解析的时间也影响着序列化的性能;
  • 兼容性:系统升级会使某一实体的属性变更,会不会导致序列化异常;

3. 常见的几种序列化的方式

  • Java原生序列化
  •    一个对象需要序列化,需要实现Serializable接口,并改写serialVersionUID字段值。
  •    它会将类的信息和状态信息一起序列化到一个二进制数组里,保存到磁盘或者通过网络传输,当我们从磁盘或者网络收到这个二进制数组时,就可以通过这个数据进行反序列化来还原我们程序中的对象,但是这个序列化方式有如下缺点,一般不建议使用:
    1、序列化反序列化的性能较长,会导致程序性能变慢。 2、序列化产生的码流较大,会占用更多的磁盘和带宽。 3、只能在Java里使用,不能跨语言使用。
  • json序列化
  •    在Json序列化之前,我们还用过xml的方式来保存数据,json相比xml,精简了不少,从xml的标签对改为了json字段名,也不用进行繁重的dom解析,现在的xml我们常见的是一些配置文件采用了这个格式。
  •    Json序列化是目前比较常用的序列化方式,不管是Http的调用,还是缓存数据的序列化,90%以上都是用这个,有一批优秀的Json序列化框架,如FastJson、Jackson等。
  • ProtoBuf序列化
    ProtoBuf序列化是公认的最好的序列化框架之一。具有极佳的序列化反序列化速度和极小的码流,非常适合追求极致性能的应用程序。
  • 1、优势
    把数据变小一点,对于一条数据,json的表示方法:
{ "age": 30, "name": "zhangsan", "height": 175.33, "weight": 140 }
    protobuf省去了很多中间冗余的{}"":,等,同时传输的过程中省略了null值
  • 采用tag技术,替代json的key/value,使用tag的话,一般只占用1个字节,而json的key一个字符就占1个字节;
  • 在传输的过程中,会对整数进行压缩,例如一个long类型的1,会压缩成byte类型的1,这些是在内部操作的,对开发而言,是透明的;
  • protobuf是采用tag/leg/value的方式来保存数据的,读到某个字段(tag)后,直接获取长度leg,解析出来就是所需要的值,而json需要解析字符串才可以办到。
    2、如何使用:
  • 引入依赖:
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.5.1</version>
<scope>compile</scope>
</dependency>
  • 编写proto文件
syntax = "proto3";
option java_package = "chen.huai.jie.sdn.message.proto";
message StoreContent {
    string topic =1;
    string key =2;
    bytes message=3;
}
  • 导入protoc.exe可执行文件
  • 利用命令来生成proto对应的java文件

protoc --java_out=..\java --proto_path=. *.proto

  • 最终生了我们java里需要用到的文件,每次改动proto文件后都需要重新生成。
  • 一些其他的序列化方式
  • 1、Avro是Hadoop的一个子项目。
  •    Avro设计用于支持数据密集型应用程序的数据格式,并具有很好的跨语言性,Avro数据通过与语言无关的schema来定义,schema通过JSON来描述,解析数据时使用schema,数据被序列化成二进制文件或JSON文件。
  •    序列化效率与Google的protobuffer相当。当数据密集型应用使用RPC进行网络传输时,Avro支持远程过程调用(RPC)协议。
    2、Spearal是一个新的开源的序列化协议,这个协议旨在初步替换JSON 将HTML和移动应用连接到Java的后端。    Spearal的主要目的是提供一个序列协议,这个协议即使是在端点间传输的复杂的数据结构中也可以简单工作。
  •    Spearal还提供了在标准JSON中没有的高级功能,如局部对象序列化、内建的对JPA的非初始化关联、不同型号的协调、对象特性过滤等。虽然还在初期发展阶段,但是Spearal在将HTML应用连接到Java后端上已经很有用了。

参考链接:

【1】https://baijiahao.baidu.com/s?id=1719897485140595906&wfr=spider&for=pc

【2】https://cloud.tencent.com/developer/article/1446854

相关文章
|
5月前
|
存储 XML JSON
日常小知识点之序列化结构(protobuf使用及简单原理)
日常小知识点之序列化结构(protobuf使用及简单原理)
63 0
|
8月前
|
XML 存储 C#
C#三十一 序列化与反序列化
C#三十一 序列化与反序列化
24 0
|
10月前
|
存储 XML JSON
|
10月前
|
存储 XML 消息中间件
一文彻底搞懂序列化和反序列化
一文彻底搞懂序列化和反序列化
|
11月前
|
数据库 数据格式 Python
聊一聊序列化和反序列化
聊一聊序列化和反序列化
79 1
|
12月前
|
XML NoSQL PHP
反序列化的深入探讨
反序列化的深入探讨
反序列化的深入探讨
|
存储 XML JSON
序列化和反序列化的底层实现原理是什么?
序列化和反序列化的底层实现原理是什么?
122 0
|
JSON 前端开发 关系型数据库
高频面试题-DRF-序列化-反序列化
Django-drf框架最大的亮点莫过于Serializer序列化器这个操作了, 它极大的简化了程序员在模型类和JSON数据格式之间转换的代码,节省了大量的时间和遍历。
高频面试题-DRF-序列化-反序列化
|
XML JSON 缓存
面试题:Java序列化与反序列化
面试题:Java序列化与反序列化
面试题:Java序列化与反序列化
|
Java 编译器 API
Java——谈谈框架中经常见到的序列化与反序列化技术
Java——谈谈框架中经常见到的序列化与反序列化技术
Java——谈谈框架中经常见到的序列化与反序列化技术