protobuf进阶
目录
1|0protobuf进阶
2|0一、protobuf 基本类型和默认值
2|11.1 protobuf类型和语言对应关系
- 该表格展示了定义于.proto文件中的类型,与go和python对应的类型:
.proto Type | Notes | Python Type | Go Type |
---|---|---|---|
double | float | float64 | |
float | float | float32 | |
int32 | 使用变长编码,对于负值的效率很低,如果你的域有可能有负值,请使用sint64替代 | int | int32 |
uint32 | 使用变长编码 | int | uint32 |
uint64 | 使用变长编码 | int | uint64 |
sint32 | 使用变长编码,这些编码在负值时比int32高效的多 | int | int32 |
sint64 | 使用变长编码,有符号的整型值。编码时比通常的int64高效。 | int | int64 |
fixed32 | 总是4个字节,如果数值总是比总是比228大的话,这个类型会比uint32高效。 | int | uint32 |
fixed64 | 总是8个字节,如果数值总是比总是比256大的话,这个类型会比uint64高效。 | int | uint64 |
sfixed32 | 总是4个字节 | int | int32 |
sfixed64 | 总是8个字节 | int | int64 |
bool | bool | bool | |
string | 一个字符串必须是UTF-8编码或者7-bit ASCII编码的文本。 | str | string |
bytes | 可能包含任意顺序的字节数据。 | str | []byte |
- 可以在文章Protocol Buffer 编码中,找到更多"序列化消息时各种类型如何编码"的信息。
- 在java中,无符号32位和64位整型被表示成他们的整型对应形似,最高位被储存在标志位中。
- 对于所有的情况,设定值会执行类型检查以确保此值是有效。
- 64位或者无符号32位整型在解码时被表示成为ilong,但是在设置时可以使用int型值设定,在所有的情况下,值必须符合其设置其类型的要求。
- python中string被表示成在解码时表示成unicode。但是一个ASCIIstring可以被表示成str类型。
- Integer在64位的机器上使用,string在32位机器上使用
2|21.2 protobuf默认值
-
如果protobuf定义了类型,在gRPC使用过程中没有传值,会使用默认值
-
当一个消息被解析的时候,如果被编码的信息不包含一个特定的元素,被解析的对象锁对应的域被设置位一个默认值,对于不同类型指定如下:
-
对于strings,默认是一个空string
-
对于bytes,默认是一个空的bytes
-
对于bools,默认是false
-
对于数值类型,默认是0
-
对于枚举,默认是第一个定义的枚举值,必须为0;
-
对于消息类型(message),域没有被设置,确切的消息是根据语言确定的,详见generated code guide
对于可重复域的默认值是空(通常情况下是对应语言中空列表)。
注:对于标量消息域,一旦消息被解析,就无法判断域释放被设置为默认值(例如,例如boolean值是否被设置为false)还是根本没有被设置。你应该在定义你的消息类型时非常注意。例如,比如你不应该定义boolean的默认值false作为任何行为的触发方式。也应该注意如果一个标量消息域被设置为标志位,这个值不应该被序列化传输。
查看generated code guide选择你的语言的默认值的工作细节
2|33. 案例
(1)目录结构
(2)hello.proto
(3)生成go文件
(4)client/main.go
(5)server/main.go
3|0二、option go_package的作用
- 可以为.proto文件新增一个可选的package声明符,用来防止不同的消息类型有命名冲突,区分语言,go_package为go语言的定义
4|0三、服务端客户端同步问题
- 因为客户端和服务端要使用同一个proto文件,可能是两个人写的,如果两个proto文件内容不一致,会导致错误
4|13.1 顺序导致的错误
(1)目录结构
(2)server/proto/hello.proto
(3)client/proto/hello.proto
(4)生成go文件
(5)client/main.go
(6)server/main.go
4|23.2 服务端数据多,客户端数据少
- 这样不客户端和服务端都能运行,只是数据会少
5|0四、import另一个proto
5|14.1 引入自定义的proto
(1)目录结构
(2)proto/order.proto
(3)oproto/order.proto
(4)命令生成go文件
(5)client/main.go
(5)server/main.go
5|24.2 引入内置的proto
(1)proto/order.proto
(2)oproto/order.proto
(3)命令生成go文件
5|3(4)client/main.go
(6)server/main.go
6|0五、嵌套message对象
- proto文件的message可以嵌套其他的message,修改order.proto如下
(1)order.proto
(2)命令生成go文件
(3)client/main.go
(4)server/main.go
7|0六、enum枚举类型
(1)命令生成go文件
(2)server/main.go
(3)client/main.go
8|0七、map类型
(1)order.proto
(2)命令生成go文件
(3)server/main.go
(4)client/main.go
9|0八、内置的timestamp类型
(1)order.proto
(2)命令生成go文件
(3)server/main.go
(4)client/main.go
__EOF__

本文作者:BigSun丶
本文链接:https://www.cnblogs.com/Mcoming/p/18080571.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/Mcoming/p/18080571.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了