protobuf的相比xml、json协议的优势明显
首先 protobuf是一个开源项目,是goole内部久经考验的一个东西。主要用于结构化数据串行化的灵活、高效、自动的方法,有如XML,不过他更小,更快,也更简单。你可以定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构。甚至可以在无需重新部署程序的情况下更新数据结构。
protobuf的优点:
1、性能好/效率高
时间开销: XML格式化(序列化)的开销还好;但是XML解析(反序列化)的开销就不敢恭维了。 但是protobuf在这个方面就进行了优化。可以使序列化和反序列化的时间开销都减短。
空间开销:也减少了很多
2、有代码生成机制
比如你你写个一下类似结构体的内容
3、支持向后兼容和向前兼容
当客户端和服务器同事使用一块协议的时候, 当客户端在协议中增加一个字节,并不会影响客户端的使用
4、支持多种编程语言
在Google官方发布的源代码中包含了c++、java、Python三种语言
protobuf的缺陷
1、二进制格式导致可读性差
为了提高性能,protobuf采用了二进制格式进行编码。这直接导致了可读性差。
2、缺乏自描述
一般来说,XML是自描述的,而protobuf格式则不是。 给你一段二进制格式的协议内容,不配合你写的结构体是看不出来什么作用的。
总结起来也可以认为安全性好。
公司的项目利用protobuf与MQ和不同的系统进行通信。很好的使用了protobuf的语言转换的功能,web端(JAVA)与服务端(C++)的进行交互就是使用了protobuf。
protobuf正确使用姿势:
第一步:下载protobuf的编译器,并配置环境变量。
第二步:根据proto文件生成.java文件(就是所谓的模型)。
第三步:将生成的模型复制到我们的项目中使用。
这篇博客主要关注点在如何生成.java文件上,后期使用没有着重讲述。系统是win10的
1、下载编译器:https://github.com/protocolbuffers/protobuf/releases
2、配置protobuf环境变量,找到protoc.exe的路径,如下图:
3、执行编译命令,首先需要cd到.proto文件目录下如:执行次脚本:
protoc --proto_path=./ --java_out=./ ./Student.proto
输入脚本回车即可执行:
命令: protoc --proto_path=./ --java_out=./ ./Student.proto
.java文件就会生成了
最后给出.proto文件给大家:
syntax = "proto3";
//生成文件所在包名
option java_package = "com.demo";
//生成的java文件名
option java_outer_classname = "ProtoDemo";
message Student {
int32 id = 1;
string name = 2;
string email = 3;
//枚举类
enum Sex {
MAN = 0;
WOMAN = 1;
}
Sex sex = 4 ;
enum PhoneType{
MOBILE = 0;
HOME = 1;
WORK = 2;
}
//内部类
message PhoneNumber {
string number = 1;
PhoneType type = 2 ;
}
//集合
repeated PhoneNumber phone = 5;
}
哈哈哈~~~,大功告成!