protobuf笔记

2020-04-06  本文已影响0人  林桉

protobuf是一种基于二进制的协议,它能够非常快速高效的序列化数据,考虑之前的xml,但是它的体积要比xml小的多得多。当然使用它还有其他非常之多的理由。我们考虑java的情况,传统的序列化方法就是实现Serialization,不过它带来非常之多的烦恼,比如版本兼容,这会带来非常之大的测试压力,且它的处理完的数据并不能跨语言的分享啊,python or c++都不能够使用,这是很头疼的。除此之外,我们序列化数据的时候我们会使用一些ad-hoc way,比如会把数据都放在一个字符串里面,考虑有四个整形数据的例子:"12:3:-23:67",它显然是足够简单的,但是却需要手写一些解析,编码代码,并且,还有一些运行时损耗。再后者,我们可能会想到使用xml,显然它是不太好的,不然也就没有json了。

1 定义.proto文件,用来定义你的数据结构

2 使用protoc编译器进行编译,导出java代码

3 使用java api进行数据的读写
平台无关,语言无关,可扩展;
提供了友好的动态库,使用简单;
解析速度快,比对应的XML快约20-100倍;
序列化数据非常简洁、紧凑,与XML相比,其序列化之后的数据量约为1/3到1/10。

1 . proto.proto 转 proto.java

image.png
  protoc --java_out ./ ./PayInfo.proto

2 . pb反射

3 . 编程规范

message SearchRequest {
  required string query = 1;
  optional int32 page_number = 2;
  optional int32 result_per_page = 3;
}

required是永久性的:在将一个字段标识为required的时候,应该特别小心。如果在某些情况下不想写入或者发送一个required的字段,将原始该字段修饰符更改为optional可能会遇到问题——旧版本的使用者会认为不含该字段的消息是不完整的,从而可能会无目的的拒绝解析。在这种情况下,你应该考虑编写特别针对于应用程序的、自定义的消息校验函数。

message SearchRequest {
  required string query = 1;
  optional int32 page_number = 2;
  optional int32 result_per_page = 3;
}

message SearchResponse {
 ...
}

如上所述,消息描述中的一个元素可以被标记为“可选的”(optional)。一个格式良好的消息可以包含0个或一个optional的元素。当解 析消息时,如果它不包含optional的元素值,那么解析出来的对象中的对应字段就被置为默认值。默认值可以在消息描述文件中指定。例如,要为 SearchRequest消息的result_per_page字段指定默认值10,在定义消息格式时如下所示:

optional int32 result_per_page = 3 [default = 10];

4 . 实例

参考:

https://blog.csdn.net/u013022222/article/details/50521835
安装:https://blog.csdn.net/xxjuanq_only_one/article/details/50465272
https://www.cnblogs.com/NeilZhang/p/8410589.html
https://blog.csdn.net/boshuzhang/article/details/73740470
http://ju.outofmemory.cn/entry/109294

上一篇 下一篇

猜你喜欢

热点阅读