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

本文涉及的产品
云解析DNS-重点域名监控,免费拨测 20万次(价值200元)
简介: 【序列化】的一些基础知识

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

相关文章
|
3月前
|
机器学习/深度学习 人工智能 资源调度
大语言模型的核心算法——简要解析
大语言模型的核心算法基于Transformer架构,以自注意力机制为核心,通过Q、K、V矩阵动态捕捉序列内部关系。多头注意力增强模型表达能力,位置编码(如RoPE)解决顺序信息问题。Flash Attention优化计算效率,GQA平衡性能与资源消耗。训练上,DPO替代RLHF提升效率,MoE架构实现参数扩展,Constitutional AI实现自监督对齐。整体技术推动模型在长序列、低资源下的性能突破。
439 8
|
监控 Java 调度
分布式系列教程(17) - 分布式任务调度平台XXL-JOB
分布式系列教程(17) - 分布式任务调度平台XXL-JOB
648 0
|
机器学习/深度学习 数据采集 自然语言处理
让大模型变得更聪明三个方向
让大模型变得更聪明三个方向
432 2
|
数据可视化 项目管理 数据库
一文看懂团队协作工具:谁能胜出2024榜单?
随着远程办公和数字化管理的普及,团队协作工具成为企业必备。本文深入评测了六款主流工具:板栗看板、Notion、Trello、Asana、ClickUp 和 Slack,从功能特色、优缺点、使用场景及性价比等方面进行分析,帮助你选择最适合团队的协作利器。
334 0
|
缓存 算法 Linux
Linux内核中的调度策略优化分析####
本文深入探讨了Linux操作系统内核中调度策略的工作原理,分析了不同调度算法(如CFS、实时调度)在多核处理器环境下的性能表现,并提出了针对高并发场景下调度策略的优化建议。通过对比测试数据,展示了调度策略调整对于系统响应时间及吞吐量的影响,为系统管理员和开发者提供了性能调优的参考方向。 ####
|
存储 算法 Android开发
【算法基础】拓扑排序及实战
在图论中,如果一个有向图从任意顶点出发无法经过若干条边回到该点,则这个图是一个**有向无环图(DAG,Directed Acyclic Graph)**
|
XML 存储 JSON
(十二)探索高性能通信与RPC框架基石:Json、ProtoBuf、Hessian序列化详解
如今这个分布式风靡的时代,网络通信技术,是每位技术人员必须掌握的技能,因为无论是哪种分布式技术,都离不开心跳、选举、节点感知、数据同步……等机制,而究其根本,这些技术的本质都是网络间的数据交互。正因如此,想要构建一个高性能的分布式组件/系统,不得不思考一个问题:怎么才能让数据传输的速度更快?
821 1
|
Ubuntu 应用服务中间件 Linux
Linux使用Nginx搭建图片服务器
Linux使用Nginx搭建图片服务器
486 0
|
安全 数据建模 网络安全
便宜多域名SSL证书申请平台推荐
【7月更文挑战第25天】
246 1
|
存储 人工智能 JSON
【AI大模型应用开发】【LangChain系列】3. 一文了解LangChain的记忆模块(理论实战+细节)
本文介绍了LangChain库中用于处理对话会话记忆的组件。Memory功能用于存储和检索先前的交互信息,以便在对话中提供上下文。目前,LangChain的Memory大多处于测试阶段,其中较为成熟的是`ChatMessageHistory`。Memory类型包括:`ConversationBufferMemory`(保存对话历史数组)、`ConversationBufferWindowMemory`(限制为最近的K条对话)和`ConversationTokenBufferMemory`(根据Token数限制上下文长度)。
709 0