1. proto文件
除了定义string, int等基础对象外(protobuf的基础数据结构和Java变量的对应关系见文章末尾),还可以在proto中定义更复杂的对象,详细如下:
- 定义List列表:
值可以是普通变量,也可以复杂对象。
message ComplexObject {
repeated string sons = 4; // List列表
repeated Result result = 6; // 复杂的对象List
}
// 定义一个新的对象
message Result {
string url = 1;
string title = 2;
repeated string snippets = 3;
}
- 定义枚举成员
message ComplexObject {
...
Gender gender = 5; // Enum值
...
}
enum Gender {
MAN = 0;
WOMAN = 1;
}
- 定义Any对象:
用于定义任意的值
message ComplexObject {
repeated google.protobuf.Any any = 7; // Any对象
}
- 定义Map对象:
key,value都可以是复杂对象
message ComplexObject {
map<string, MapVaule> map = 8; // 定义Map对象
}
// 定义Map的value值
message MapVaule {
string mapValue = 1;
}
- 通过 reserved保留 Assigning Tags和filed name用于将来扩展用
message ComplexObject {
reserved 12, 15, 9 to 11; // 预留将来使用的Assigning Tags,
reserved "foo", "bar"; // 预留将来使用的filed name
}
完整proto文件:
// 如果使用此注释,则使用proto3; 否则使用proto2
syntax = "proto3";
// 引入外部的proto对象
import "google/protobuf/any.proto";
// 生成类的包名
option java_package = "com.hry.spring.proto.complex";
//生成的数据访问类的类名
option java_outer_classname = "MyComplexObjectEntity";
message ComplexObject {
// Message里每个成员变量都有一个唯一的数字标志( Assigning Tags)
int32 id = 1;// singular, 默认值,表示成员只有0个或者1个
string name = 2;//
string email = 3;//
repeated string sons = 4; // repeated 列表
Gender gender = 5; // Enum值
repeated Result result = 6; // 新的对象List
repeated google.protobuf.Any any = 7; // Any对象
map<string, MapVaule> map = 8; // 定义Map对象
// reserved
reserved 12, 15, 9 to 11; // 预留将来使用的Assigning Tags,
reserved "foo", "bar"; // 预留将来使用的filed name
}
enum Gender {
MAN = 0;
WOMAN = 1;
}
// 定义一个新的对象
message Result {
string url = 1;
string title = 2;
repeated string snippets = 3;
}
// 定义Map的value值
message MapVaule {
string mapValue = 1;
}