当前位置:网站首页>序列化技术ProtoBuf
序列化技术ProtoBuf
2022-08-10 09:49:00 【C0oOder】
序列化技术ProtoBuf
ProtoBuf :https://developers.google.cn/protocol-buffers
1.什么是序列化
把对象内容转化成数据流;
与之对应的就是反序列化:从数据流中读取数据,然后重新转换成对象;
序列化反序列化往往是遵循一定的格式来操作的;
常见的序列化有:把对象转成XML,JSON,二进制流
特点 | XML | JSON | ProtoBuf |
---|---|---|---|
数据结构 | 复杂 | 简答 | 较复杂 |
保存方式 | 文本 | 文本 | 二进制 |
保存大小 | 大 | 一般 | 小 |
解析速度 | 慢 | 一般 | 快 |
语言支持 | 多 | 多 | C/Java/py |
开发难易 | 麻烦 | 简答 | 简答 |
2.跨平台序列化
我的理解是序列化就是为了跨平台而来的,不同平台之间要相互通信,对象序列化就要遵循相互的规则;
一般跨平台的东西,很明显都需要一个中间量来过滤,比如Java 跨平台,就需要class 文件就相当于是模板,Thrift 跨平台rpc ,就需要定义格式文件 .thrift ;同样我们的ProtoBuf 是一款跨平台序列胡工具也是需要来定义 .proto
3.安装
我是windows 上测试的 直接下载对应版本 https://github.com/protocolbuffers/protobuf/releases/tag/v21.4
安装好环境变量 执行 有版本信息就表示OK
C:\Users\sff>protoc --version
libprotoc 2.5.0
4.模板学习
类型学习
https://developers.google.cn/protocol-buffers/docs/proto
// 声明语法开头
syntax = "proto2";
//避免在 Protocol Buffers 名称空间以及非 Java 语言中的名称冲突。
package tutorial;
option java_multiple_files = true;
// java 对应的包和类
option java_package = "com.example.tutorial.protos";
//。如果你没有java_outer_classname明确给出a,它将通过将文件名转换为大写驼峰式来生成
option java_outer_classname = "AddressBookProtos";
message Person {
//标准的简单数据类型可用作字段类型 optional: 该字段可以设置也可以不设置 required:必须提供该字段的值,否则该消息将被视为“未初始化”
// repeated:该字段可以重复任意次数 required字段是非常不受欢迎的
optional string name = 1;
optional int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
optional string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phones = 4;
}
message AddressBook {
repeated Person people = 1;
}
生成java代码 (也可以生成其他语言的代码)
protoc addressbook.proto --java_out=D:\Resource\FrameMiddleware\proto\template
标准消息方法
每个消息和构建器类还包含许多其他方法,可让您检查或操作整个消息,包括:
isInitialized()
: 检查是否所有必填字段都已设置。toString()
:返回消息的人类可读表示,对于调试特别有用。mergeFrom(Message other)
:(仅限构建器)将 的内容other
合并到此消息中,覆盖单个标量字段,合并复合字段,并连接重复的字段。clear()
:(仅限构建器)将所有字段清除回空状态。
这些方法实现了所有 Java 消息和构建器共享的Message
和接口。Message.Builder
有关更多信息,请参阅完整的 API 文档Message
。
解析和序列化
最后,每个协议缓冲区类都有使用协议缓冲区二进制格式写入和读取您选择的类型的消息的方法。这些包括:
byte[] toByteArray();
:序列化消息并返回包含其原始字节的字节数组。static Person parseFrom(byte[] data);
: 从给定的字节数组中解析消息。void writeTo(OutputStream output);
: 序列化消息并将其写入OutputStream
.static Person parseFrom(InputStream input);
: 读取并解析来自InputStream
.
5.测试
生成的代码导入 添加maven
<dependencies>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>1.30.2</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>1.30.2</version>
</dependency>
<!-- 用于对比测试-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
</dependencies>
java 测试代码
public class Main {
public static void main(String[] args) {
Person build = Person.newBuilder().setEmail("aaaaa").setName("zhangsan").setId(10).build();
System.out.println(build);
byte[] bytes = build.toByteArray();
System.out.println("bp size =" + bytes.length + "B");
PersonB personB = new PersonB("aaaaa", "zhangsan", 10);
byte[] bytes1 = JSONObject.toJSONString(personB).getBytes();
System.out.println(JSONObject.toJSONString(personB));
System.out.println("fastjson size =" + bytes1.length + "B");
}
}
结果
name: "zhangsan"
id: 10
email: "aaaaa"
bp size =19B
{
"email":"aaaaa","id":10,"name":"zhangsan"}
fastjson size =43B
实际测试下来是相差一半的,不过我这个测试只是一个不太严谨的测试。。。。。
6.Avro
对比与pb Avro 是java编写的,也是一个跨语言的序列化工具 ,套路其实差不多
边栏推荐
- Oracle rac所在的网络要割接,停掉其中一个rac节点,这种方案可行吗?
- VBA: 采用Combox控件实现二级下拉菜单功能
- 裸辞→自我放松→闭关→复习→斩获Offer
- Shell脚本数组
- 【数据库架构】OLTP 和 OLAP:实际比较
- Tencent releases the second-generation version of the quadruped robot Max, which completes jumps and somersaults on the plum blossom pile
- 【物联网架构】最适合物联网的开源数据库
- 《广州市公路工程安全生产监督管理办法》印发,从六大方面进行修订
- CAD to WPF: Tips on converting CAD drawing files to WPF vector code files (xaml files)
- 07 【动态组件 组件注册】
猜你喜欢
随机推荐
「数据架构」数据模型,数据字典,数据库模式 和ERD的比较
BUUCTF【pwn】解题记录(4-6页持续更新中)
「业务架构」TOGAF建模:组织分解图(组织映射)
VBA: Inputbox Function and Inputbox Method
线程池的基本概念、结构、类
腾讯发布四足机器人 Max 二代版本,梅花桩上完成跳跃、空翻
web项目访问引用jar内部的静态资源
Fourier series and Fourier transform
【元宇宙欧米说】听兔迷兔如何从虚拟到现实创造潮玩新时代
【数据架构】分布式数据网格作为集中式数据单体的解决方案
LCD DRM驱动框架分析二
「技术选型」工作流引擎哪家强?首席架构帮你挑
单例模式基类
The first offline workshop in 2022!Data application experience day for application developers is coming | TiDB Workshop Day
DeepFake换脸诈骗怎么破?让他侧个身
【企业架构】敏捷与企业架构:战略联盟
CSDN 21 Days Learning Challenge - Polymorphism (05)
Defending risks with technology and escorting cloud native | Tongchuang Yongyi X Boyun held a joint product launch conference
Optimistic and pessimistic locking
Matlab符号函数的生成及计算其函数值