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

java 类与proto解析 @protobuf注解 java_XML

2、配置protobuf环境变量,找到protoc.exe的路径,如下图:

java 类与proto解析 @protobuf注解 java_java_02

java 类与proto解析 @protobuf注解 java_java文件_03

3、执行编译命令,首先需要cd到.proto文件目录下如:执行次脚本:

protoc --proto_path=./ --java_out=./ ./Student.proto

 

java 类与proto解析 @protobuf注解 java_java 类与proto解析_04

java 类与proto解析 @protobuf注解 java_java文件_05

 输入脚本回车即可执行:

java 类与proto解析 @protobuf注解 java_java_06

 命令: protoc --proto_path=./ --java_out=./ ./Student.proto

.java文件就会生成了

java 类与proto解析 @protobuf注解 java_java_07

最后给出.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;
}

 哈哈哈~~~,大功告成!