简单的实验
proto如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
syntax = "proto3";
message SearchRequest3 {
enum Corpus{
UNIVERSAL = 0;
WEB = 1;
IMAGES = 2;
LOCAL = 3;
NEWS = 4;
PRODUCTS = 5;
VIDEO = 6;
}
string query = 1;
int32 page_number = 2;
int32 result_per_page = 3;
Corpus corpus = 4;
}
|
java代码如下:
1
2
3
4
5
6
7
8
|
SearchRequest3OuterClass.SearchRequest3.newBuilder()
.setQuery("query")
.setPageNumber(1)
.setResultPerPage(1)
.setCorpusValue(SearchRequest3OuterClass.SearchRequest3.Corpus.UNIVERSAL.getNumber())
.build();
|
(感觉代码不是很优雅,还需要持续的学习,寻找更优雅的编码方案)
为值定义别名
可以通过为不同的枚举常量分配相同的值来定义别名,为此需要经applow_alias选项设置为true,否则协议编辑器将在找到别名时生成错误消息:
1
2
3
4
5
6
7
8
9
10
|
message MyMessage1 {
enum EnumAllowingAlias {
option allow_alias = true;
UNKNOWN = 0;
STARTED = 1;
RUNNING = 1;
}
}
|
我是知道java的枚举时不支持修改original的值的,我很好奇这个别名时如何实现的,发现如下源码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public enum EnumAllowingAlias
implements com.google.protobuf.ProtocolMessageEnum {
/**
* <code>UNKNOWN = 0;</code>
*/
UNKNOWN(0),
/**
* <code>STARTED = 1;</code>
*/
STARTED(1),
;
/**
* <code>RUNNING = 1;</code>
*/
public static final EnumAllowingAlias RUNNING = STARTED;
}
|
有点意思,这是非常巧妙的一种实现方式。