Protobuf 序列化和反序列化源码分析
来源:互联网 发布:js 插件写法 面向对象 编辑:程序博客网 时间:2024/05/23 12:02
假设大家对protobuf有一些基础,没有用过也没有关系
这里使用protobuf 3.5.0
编写proto文件
syntax = "proto3";package tutorial;option java_package = "com.spy.test.protobuf.model";option java_outer_classname = "UserV3Proto";// User domain comment/* user domain comment*/message User{ int64 user_id = 1; string user_code = 2; string user_name =3; string email =4; int32 age = 5; repeated string roles = 6; map<string, string> address=7;}
生成java类文件
protoc userV3.proto --java_out=./
编写序列化和反序列化单元测试
UserV3Proto.User user = UserV3Proto.User.newBuilder() .setUserId(2L) .setUserCode("00001") .setUserName("cc") .setAge(20) .addRoles("admin") .addRoles("cc") .putAddress("a", "1") .putAddress("b", "2") .build(); byte[] bytes = user.toByteArray(); log.debug("{}", bytes); log.debug("{}", bytes.length); // 反序列化 UserV3Proto.User user2 = UserV3Proto.User.parseFrom(bytes); log.debug("{}", user2.toString());
序列化后的码流
[8, 2, 18, 5, 48, 48, 48, 48, 49, 26, 2, 99, 99, 40, 20, 50, 5, 97, 100, 109, 105, 110, 50, 2, 99, 99, 58, 6, 10, 1, 97, 18, 1, 49, 58, 6, 10, 1, 98, 18, 1, 50]
下面就对这些码流进行分析,逐步拆解到每个字段
.toByteArray()源码分析
写int
通过上面的流程,发现写一个TAG
,这个值是字段序号(fieldNumber
)左移3位,再或
上字段类型,得值8,再将值2输出,即:
user_id: 8, 2,
写String
以user_code为例:
同样,先写了一个TAG
,其值为(2<<3|2)=18,然后输出string,即:
user_code: 18, 5, 48, 48, 48, 48, 49,
写Array
这里以role为例
其实这里的数组role,就是循环输出了String,这里不做过多说明,即:
role: 50, 5, 97, 100, 109, 105, 110,
role: 50, 2, 99, 99,
写Map
这里以address为例
这里开始序列化map字段
对map中每项进行输出
先输出TAG,58(自己计算,同上)
这里开始输出map中的具体内容
先输出了key和value的序列化总大小,6
将key和value内容序列化输出,类型索引(key或value)大小+长度大小+具体内容
即:
- address 58, 6, 10, 1, 97, 18, 1, 49,
- address 58, 6, 10, 1, 98, 18, 1, 50
总结:
- user_id: 8, 2,
- user_code: 18, 5, 48, 48, 48, 48, 49,
- user_name: 26, 2, 99, 99,
- age: 40, 20,
- role: 50, 5, 97, 100, 109, 105, 110,
- role: 50, 2, 99, 99,
- address: 58, 6, 10, 1, 97, 18, 1, 49,
- address: 58, 6, 10, 1, 98, 18, 1, 50
.parseForm()源码分析
通过上述截图,可以直观看到根据TAG
即可识别到具体的那个field
,然后赋值。
全篇完。
- Protobuf 序列化和反序列化源码分析
- google protobuf入门(序列化和反序列化)
- 使用protoBuf进行序列化和反序列化
- 【Protocol Buffer】Protobuf的序列化和反序列化
- ProtoBuf的序列化和反序列化
- protobuf 序列化 反序列接口
- 【protobuf】 3.使用protobuf-csharp-port进行序列化和反序列化
- 序列和反序列化
- 序列和反序列化
- java中使用protobuf序列化(反序列化)
- ProtoBuf 常用序列化/反序列化API
- java中使用protobuf序列化(反序列化)
- ProtoBuf 常用序列化/反序列化API
- ProtoBuf 常用序列化/反序列化API
- ProtoBuf 常用序列化/反序列化API
- protobuf 常用序列化/反序列化 api
- protobuf 的序列化与反序列化
- ProtoBuf 常用序列化/反序列化API
- 数据库-主键、外键
- Mac 安装Qt
- MediaMuxer和MediaExtractor类(音频和视频数据的混合和分离)
- wordpress更新
- SAO为例浅析跟踪HM代码
- Protobuf 序列化和反序列化源码分析
- 模拟实现strncat( )函数
- 关于时间计算的工具类 DateTool
- 变量名跟对象实体的关系
- 编写PHP二维码API中图像的的大小固定
- 调研问卷系统 DWSurvey,基于 JAVA WEB 开发
- 分布式服务框架Dubbo疯狂更新!阿里开源要搞大事情?
- Jenkins+SVN+Maven 自动化部署环境搭建
- C# 操作Excel