官方地址:
官方github:
很不错的连续教程:
C++动态编译,淘宝的技术博客
深入:
首先,什么是PB?
他是一种数据传输的方式,就跟我们使用Json传输,xml传输是一样的,但是,他的优点是fast,比他们两都快,比他们小。他的缺点是生成的是字节码,可读性很差,或许你根本不造他写的是什么鬼。
首先是语法,先看一个例子:
package com.example.liweijie.protocolbufferdemo.proto;
option java_package="com.example.liweijie.protocolbufferdemo.bean";
option java_outer_classname="PersonInfo";
message Person{
required string name=1;
required int32 age=2;
optional string email = 3;
enum PhoneType{
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber{
required string number = 1;
required PhoneType type = 2[default=HOME];
}
optional PhoneNumber phoneNumber = 4;
}
message PersonList
{
repeated Person person=1;
option java_package="com.example.liweijie.protocolbufferdemo.bean";
option java_outer_classname="PersonInfo";
message Person{
required string name=1;
required int32 age=2;
optional string email = 3;
enum PhoneType{
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber{
required string number = 1;
required PhoneType type = 2[default=HOME];
}
optional PhoneNumber phoneNumber = 4;
}
message PersonList
{
repeated Person person=1;
}
语法:
package:声明该proto文件所在的包位置
option java_package和option java_outer_classname,指定生存的java类所在包和类名
message声明一个消息体,相当于java的class。
required:表示该字段是必须的,在使用的时候必须赋值
optional:表示该字段是可选的,在使用的时候可以不赋值,
repeated 表示该字段是可重复的,相当于java的list
default 为某一个字段设置默认值 假如没有设置,则是默认值,string是null,boolean是false,int是0,enum是第一个
message是可以嵌套,也可以独立的,相当于内部类外部类之类的,假如是使用外部的proto文件,需要import进来。语法是:
import "squareup/geology/period.proto";//可以是全路径,也可以是酱,需要在同一个工作路径之下
当我们需要引用外部的message的时候就是需要这样子。
其中,每一个字段之后有一个值:是该字段的唯一标示符,在二进制编码时候会用到。数字1~15的表示需求少于一个字节,所以在编码的时候,有这样一个优化,你可以用1~15标记最常使用或者重复字段元素(repeated elements)。用16或者更大的数字来标记不太常用的可选元素。再重复字段中,每一个元素都需重复编码标签数字,所以,该优化对重复字段最佳(repeat fileds)。比如上面的name =1
数据类型: