| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 序列化和反序列化 -> 正文阅读 |
|
[网络协议]序列化和反序列化 |
一、序列化和反序列化“序列化”和“反序列化”一定会涉及POJO的编码和格式化(Encoding & Format), 目前我们可选择的编码方式有: ??使用JSON。将Java POJO对象转换成JSON结构化字符串。基于HTTP协议,在Web 应用、移动开发方面等,这是常用的编码方式,因为JSON的可读性较强。但是它 的性能稍差。 ??基于XML。和JSON一样,数据在序列化成字节流之前都转换成字符串。可读性 强,性能差,异构系统、Open API类型的应用中常用。 ??使用Java内置的编码和序列化机制,可移植性强,性能稍差,无法跨平台(语 言)。 ??开源的二进制的序列化/反序列化框架,例如Apache Avro,Apache Thrift、 Protobuf等。前面的两个框架和Protobuf相比,性能非常接近,而且设计原理如出 一辙;其中Avro在大数据存储(RPC数据交换、本地存储)时比较常用;Thrift的 亮点在于内置了RPC机制,所以在开发一些RPC交互式应用时,客户端和服务器 端的开发与部署都非常简单。 如何选择序列化/反序列化框架呢? 评价一个序列化框架的优缺点,大概从两个方面着手: (1)结果数据大小,原则上说,序列化后的数据尺寸越小,传输效率越高。 (2)结构复杂度,这会影响序列化/反序列化的效率,结构越复杂,越耗时。 理论上来说,对于对性能要求不是太高的服务器程序,可以选择JSON文本格式的序列 化框架;对于性能要求比较高的服务器程序,则应该选择传输效率更高的二进制序列化框 架,建议是Protobuf。 Protobuf是一个高性能、易扩展的序列化框架,性能比较高,其性能的有关的数据可以 参看官方文档。Protobuf本身非常简单,易于开发,而且结合Netty框架,可以非常便捷地 实现一个通信应用程序。反过来,Netty也提供了相应的编解码器,为Protobuf解决了有关 Socket通信中“半包、粘包”等问题。 当然,无论是使用JSON、Protobuf还是其他的传输协议,我们必须保证在数据包的反序列化之前,接收端的ByteBuf二进制数据包一定是一个完整的应用层二进制包,不能是一 个半包或者粘包,这就涉及到通信过程中的拆包技术。 二、几种序列化工具箱使用JSON协议通信JSON(JavaScript Object Notation, JS?对象简谱)?是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的JS规范)的一个子集,采用完全独立于编程语言的文本 格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。 JSON协议是一种文本协议,易于人阅读和编写,同时也易于机器解析和生成,并能有 效地提升网络传输效率。 JSON的核心优势 XML也是一种常用的文本协议,XML和JSON都使用结构化方法来标记数据。和XML 相比,JSON作为数据包格式传输的时候具有更高的效率,这是因为JSON不像XML那样需 要有严格的闭合标签,这就让有效数据量与总数据包比大大提升,从而同等数据流量的情 况下,JSON减少网络的传输压力。 下面来做一个简单的比较。用XML表示中国部分省市数据如下:
可以看到,JSON的语法格式和清晰的层次结构非常简单,明显要比?XML?容易阅 读,并且在数据交换方面,由于JSON所使用的字符要比XML少得多,可以大大得节约传 输数据所占用的带宽。
在实际开发中,目前主流的策略是:Google的Gson库和阿里的FastJson库两者结合使 用。在POJO序列化成JSON字符串的应用场景(序列化场景),使用Google的Gson库;在 JSON字符串反序列化成POJO的应用场景(反序列化场景),使用阿里的FastJson库。 使用Protobuf协议通信Protobuf全称是Google Protocol Buffer,Google提出的一种数据交换的格式,是一套类 似JSON或者XML的数据传输格式和规范,用于不同应用或进程之间进行通信。Protobuf具 有以下特点:
Protobuf既独立于语言,又独立于平台。Google官方提供了多种语言的实现:Java、 C#、C++、GO、JavaScript和Python。Protobuf的编码过程为:使用预先定义的Message数据 结构将实际的传输数据进行打包,然后编码成二进制的码流进行传输或者存储。Protobuf的 解码过程则刚好与编码过程相反:将二进制码流解码成Protobuf自己定义的Message结构的 POJO实例。 与JSON、XML相比,Protobuf算是后起之秀,只是Protobuf更加适合于高性能、快速 响应的数据传输应用场景。Protobuf数据包是一种二进制的格式,相对于文本格式的数据交 换(JSON、XML)来说,速度要快很多。由于Protobuf优异的性能,使得它更加适用于分 布式应用场景下的数据通信或者异构环境下的数据交换。 另外,JSON、XML是文本格式,数据具有可读性;而Protobuf是二进制数据格式,数 据本身不具有可读性,只有反序列化之后才能得到真正可读的数据。正因为Protobuf是二进 制数据格式,数据序列化之后,体积相比JSON和XML要小,更加适合网络传输。 总体来说,在一个需要大量数据传输的应用场景中,因为数据量很大,那么选择 Protobuf可以明显地减少传输的数据量和提升网络IO的速度。对于打造一款高性能的通信 服务器来说,Protobuf传输协议是最高性能的传输协议之一。微信的消息传输就采用了 Protobuf协议。 详解Protobuf协议语法在Protobuf中,通信协议的格式是通过“.proto”文件定义的。一个“.proto”文件有两 大组成部分:头部声明、消息结构体的定义。头部声明的部分,主要包含了协议的版本、 包名、特定语言的选项设置等;消息结构体部分,可以定义一个或者多个消息结构体。 在Java中,当用Protobuf编译器(如“protoc3.6.1.exe”)来编译“.proto”文件时,编 译器将生成Java语言的POJO消息类和Builder构造者类。通过POJO消息类和Builder构造 者,Java程序可以很容易地操作在.proto文件中定义的消息和字段:包括获取、设置字段 值,将消息序列化到一个输出流中(序列化),以及从一个输入流中解析消息(反序列 化)。 官方文档: https://developers.google.com/protocol-buffers/docs/proto3 proto描述文件的编写
注意: 如下: option java_outer_classname = "BatteryData"; option java_package = "com.yjgis.test";? JAVA代码的生成 生成的代码如下所示 绿色即是上面文件生成的代码。 把生成的这个java类拷贝到工程,如下图: 主要需要使用的对象就是绿色方框内的,下面,我们来写一些代码
首先在测试工程pom里增加依赖
运行一下:
如何快速的进行json格式化 我们在使用protobuf的时候,有些场景是需要快速把protobuf生成的对象转成json的,protobuf提供了很方便的方法来实现这个功能。但是这个功能并不包含在核心包里,需要依赖protobuf的工具包。
执行结果:
可以看到protobuf数据大小是json的1/3,如果数据模型更复杂或者数据量更大,优势还会更加明显。 这里只是为了展示基础用法,实际上通过Maven插件生成POJO和Builder是更好的选择 具体使用参考下文: 几种序列化方式的总结(Serializable,json,Fastjson,ProtoBuff,Hessian和Kyro)_HX_2022的博客-CSDN博客_serializable与jackson 三、Spring整合redis序列化问题处理?https://www.csdn.net/tags/Mtzakg5sNTAwMTgtYmxvZwO0O0OO0O0O.html ??????Spring Session基于Redis存储的序列化问题 - 溪水静幽 - 博客园 ?spring-session 面对redis配置序列化无效后的解决方式_迷茫路人的博客-CSDN博客 Spring Boot2.X 自定义Redis的cacheManager,保存Json格式到Redis_caojidasabi的博客-CSDN博客_自定义rediscachemanager |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 2:00:05- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |