找回密码
 会员注册
查看: 24|回复: 0

保姆级Protobuf详解及入门指南

[复制链接]

5

主题

0

回帖

16

积分

新手上路

积分
16
发表于 2024-9-10 21:11:58 | 显示全部楼层 |阅读模式
目录Protobuf概述什么是Protobuf为什么要使用ProtobufProtobuf实战环境配置创建文件解析/封装数据附录AQin.proto完整代码Protobuf概述什么是ProtobufProtobuf(ProtocolBuffers)协议😉Protobuf是一种由Google开发的二进制序列化格式和相关的技术,它用于高效地序列化和反序列化结构化数据,通常用于网络通信、数据存储等场景为什么要使用Protobuf其实Protobuf在许多领域都得到了广泛应用,特别是在分布式系统、RPC(RemoteProcedureCall)框架和数据存储中,它提供了一种高效、简洁和可扩展的方式来序列化和交换数据,Protobuf的主要优点包括:高效性:Protobuf序列化后的二进制数据通常比其他序列化格式(比如超级常用的JSON)更小,并且序列化和反序列化的速度更快,这对于性能敏感的应用非常有益。简洁性:Protobuf使用一种定义消息格式的语法,它允许定义字段类型、顺序和规则(消息结构更加清晰和简洁)版本兼容性:Protobuf支持向前和向后兼容的版本控制,使得在消息格式发生变化时可以更容易地处理不同版本的通信。语言无关性:Protobuf定义的消息格式可以在多种编程语言中使用,这有助于跨语言的通信和数据交换(截至本文发布目前官方支持的有C++/C#/Dart/Go/Java/Kotlin/python)自动生成代码:Protobuf通常与相应的工具一起使用,可以自动生成代码,包括序列化/反序列化代码和相关的类(减少了手动编写代码的工作量,提高效率,后面的🌰里有保姆级操作指南)Protobuf实战环境配置首先我们需要在pom.xml文件中添加如下依赖:com.google.protobuf3.20.3com.google.protobuf3.20.3接着如果你希望.proto文件可以被idea识别的话,就需要安装Protobuf插件(非必要)创建文件然后我们创建一个.proto文件,如下图(完整代码在文末附录)其中syntax="proto3"表示协议版本,optionjava_package="com.aqin.protobuf"表示生成的类所处的层级,optionjava_multiple_files=true表示需要將生成的类拆分为多个(false的话就是不需要),MyRequest和Header是消息结构。进入到文件📃AQin.proto所在目录下,执行如下代码:protoc-I=./--java_out=././AQin.proto参数说明:-I用于指定.proto文件所在的路径(也可以用-proto_path代替)--java_out用于指定生成的java文件的路径./AQin.proto就是需要编译的.proto文件有一点需要注意的是这三个路径要使用相对路径就都使用相对路径,要使用绝对路径就都使用绝对路径(不要混着用),执行完成后,就会在指定的位置生成指定的文件,如下图然后我们就可以通过生成的Java类来对接收到的信息进行解析,或者封装数据进对象进行发送解析/封装数据常用APInewBuilder():用于创建Java类(通过.proto文件生成的)并返回该对象setXXX():设置属性值getXXX():获取属性值byte[]toByteArray():用于序列化信息并返回一个字节数组writeTo(OutputStreamoutput):序列化信息并写入一个输出流parseFrom(byte[]data):解析传入的字节数组(一般用于接收数据)parseFrom(InputStreaminput):解析传入的输入流(一般用于接收数据)那我们上面的AQin.proto举个🌰MyInfomyInfo=MyInfo.newBuilder().setName("Zhangsan");Bodybody=Body.newBuilder().setMyInfo(myInfo).build();ByteBufferbyteBuffer=ByteBuffer.allocate(body.toByteArray().length);body.writeTo(CodedOutputStream.newInstance(byteBuffer));//然后就可以发送了~~附录AQin.proto完整代码//协议版本syntax="proto3";//生成的类所处的层级optionjava_package="com.aqin.protobuf";//是否需要將生成的类拆分为多个optionjava_multiple_files=true;//requestmessageMyRequest{Headerheader=1;Bodybody=2;}//HeadermessageHeader{uint32RequestId=1;int64Timestamp=2;}//BodymessageBody{MyInfoInfo=1;//消息ServiceResultserviceResult=2;//结果反馈}messageMyInfo{stringname=1;stringage=2;}messageServiceResult{uint32ErrorCode=1;stringErrorMsg=2;}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-29 13:28 , Processed in 0.510854 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表