设为首页 加入收藏

TOP

Protocol Buffers数据描述语言(一)
2018-04-08 08:51:34 】 浏览:438
Tags:Protocol Buffers 数据 描述 语言

1.简介


Protocol Buffers是Google开发的一种数据描述语言,能够将数据进行序列化,可用于数据存储、通信协议等方面.可以理解成更快、更简单、更小的JSON或者XML,区别在于Protocol Buffers是二进制格式,而JSON和XML是文本格式.


相对于XML,Protocol Buffers有如下几个优点:


1.简洁


2.体积小,消息大小只有XML的1/10到1/3.


3.速度快,解析速度比XML快20~100倍.


4.使用Protocol Buffers的编译器,可以生成更容易在编程中使用的数据访问代码.


5.更好的兼容性,Protocol Buffers设计的一个原则就是要能够很好的支持向下或向上兼容.


使用不同的数据描述语言序列化后的字节个数比对:



使用不同的数据描述语言进行序列化以及反序列化的响应时间比对:



*数据在网络进行传输时要经历三个阶段: 发送方对数据进行序列化、网络中传输、接收方反序列化.


将对象序列化成protobuf、xml、json结构时,protobuf所占的字节数量最少、有效数据的比重最大、总数据最少,因此决定了数据在网络进行传输时所耗费的时间最少.


将对象序列化成protobuf、xml、json结构以及反序列化成对象时,protobuf所耗费的时间最少.


结论:数据使用protobuf序列化格式能够大大提高生产效率(服务的响应时间).


2.proto文件的语法规则


1.使用message关键字定义消息,并指定消息的名称(取一个有意义的名字)


2.指定字段的类型和名称


3.添加字段的约束


4.定义字段的编号(从1开始,其中19000~19999被Protocol Buffers作为保留字段)


 最基本的message


message User{
    required int32 id = 1;
    required string username = 2;
    required string password = 3;
    optional string email = 4;
}


字段类型



字段约束


required指定该字段必须赋值


optional表示该字段允许为空,可以使用[default]指定默认值,如果没有指定默认值则会使用字段类型的默认值.


repeated指定字段为集合.


oneof指定一组字段中必须有一个字段要赋值.


*在一个proto文件中可以同时定义多个message类型,生成代码时根据生成代码的目标语言不同,处理的方式不太一样(Java会针对每个message类型生成一个.java文件).


message User{
    required int32 id = 1;
    //username或email之间必须有一个字段要赋值
    oneof login{
      string username = 3;
      string email = 4;
    }
    required string password = 2;
}


message Admin{
    required int32 id = 1;
    required string username = 2;
    required string password = 3;
}


*可以指定字段的类型为其他的message类型.


message Course{
    required User user = 1;
    required string cour_name = 2;
}


message User{
    required int32 id = 1;
    required string username = 2;
    required string password = 3;
    optional string email = 4;
}


*在proto文件中支持类型的嵌套,即定义的message类型仅作为包含其message类型的字段类型.


message Course{
    message User{
        required int32 id = 1;
        required string username = 2;
        required string password = 3;
        optional string email = 4;
    }
    required User user = 1;
    required string cour_name = 2;
}


*使用extensions关键字预留消息类型的字段编号,通过extend关键字继续定义.


message User{
    //30~100编号为User类型私有.
    extensions 30 to 100
}


extend User{
    required int32 id = 1;
    required string username = 2;
    required string password = 3;
    optional string email = 4;
}


*可以使用import关键字导入其他proto文件.


*可以使用option java_package设置生成java类的包名.


*可以使用option java_outer_classname设置生成java类的类名.


import "other.proto"


option java_package = "com.zht.protobuf";


option java_outer_classname = "UserModel";


message User{


    required int32 id = 1;


    required string username = 2;


    required string password = 3;


    optional string email = 4;


}


3.protobuf的使用


1.环境的准备


在github下载对应操作环境的protobuf工具包: https://github.com/google/protobuf/releases


windows用户选择: protoc-3.5.1-win32.zip


解压后配置环境变量PATH,使其在上下文能直接搜索 protoc.exe.


2.编写.proto文件


E:\proto\user.proto


内容如下:


syntax = "proto2";
option java_package = "com.zht.protobuf";
option java_outer_classname = &q

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇SpringMVC参数校验 下一篇Java 并发基础教程——线程安全性

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目