码迷,mamicode.com
首页 > 编程语言 > 详细

protobuf extensions(extend)的消息定义及Java使用方法

时间:2014-07-16 12:52:46      阅读:2220      评论:0      收藏:0      [点我收藏+]

标签:protocol buffers   google   继承   setextension   message   

在定义protobuf消息时,有时候需要用到extensions来对原有的消息类型进行扩展,有利于消息定义的重复使用。

1、下面写一个最简单的例子,定义一个message BaseData,并对其进行扩展:

Example.proto:

// 定义一个message BaseData,100~199之间的tag可供扩展
message BaseData {
	required int32 code = 1;
	extensions 100 to 199;
}

// 扩展BaseData,加上一个extend_data,tag为100
extend BaseData {
	required string extend_data = 100;
}

运行protoc.exe --java_out=. Example.proto生成Example.java文件。

Java代码:

public static void main(String[] args) {
	
	Example.BaseData.Builder baseBuilder = Example.BaseData.newBuilder();
	baseBuilder.setCode(123);
	baseBuilder.setExtension(Example.extendData, "xxg");
	Example.BaseData baseData = baseBuilder.build();
	
	System.out.println(baseData.getCode());
	System.out.println(baseData.getExtension(Example.extendData));
}

这里需要调用setExtension方法来设置扩展的extendData。setExtension有两个参数,第一个定义扩展的是哪一个字段,Example.extendData即表示Example类中的extendData,第二个就是设置扩展字段的值。

2、另外还有一种常用的扩展定义方式:

Example.proto:

// 定义一个message BaseData,100~199之间的tag可供扩展
message BaseData {
	required int32 code = 1;
	extensions 100 to 199;
}

// 定义一个message Data
message Data {
	required string msg = 1;
	
	// 扩展BaseData,加上一个Data类型的字段,tag为100
	extend BaseData {
		required Data extend_data = 100;
	}
}

这种方式看起来有点奇怪,实际上可以理解成这样:

// 定义一个message BaseData,100~199之间的tag可供扩展
message BaseData {
	required int32 code = 1;
	extensions 100 to 199;
}

// 定义一个message Data
message Data {
	required string msg = 1;
}

// 扩展BaseData,加上一个Data类型的字段,tag为100
extend BaseData {
	required Data extend_data = 100;
}

Java代码:

public static void main(String[] args) {

	// 先构造一个message Data类型对象
	Example.Data.Builder dataBuilder = Example.Data.newBuilder();
	dataBuilder.setMsg("xxg");
	Example.Data data = dataBuilder.build();

	// 再构造message BaseData对象,将Data对象通过setExtension设置到BaseData中
	Example.BaseData.Builder baseBuilder = Example.BaseData.newBuilder();
	baseBuilder.setCode(123);
	baseBuilder.setExtension(Example.Data.extendData, data);
	Example.BaseData baseData = baseBuilder.build();
	
	System.out.println(baseData.getCode());
	System.out.println(baseData.getExtension(Example.Data.extendData).getMsg());
}

注意上面的Java代码用的是第一种proto消息定义方式,如果用的是下面第二种消息定义的方式,setExtension的参数Example.Data.extendData就应该改成Example.extendData,注意嵌套结构。


作者:叉叉哥   转载请注明出处:http://blog.csdn.net/xiao__gui/article/details/37874081



protobuf extensions(extend)的消息定义及Java使用方法,布布扣,bubuko.com

protobuf extensions(extend)的消息定义及Java使用方法

标签:protocol buffers   google   继承   setextension   message   

原文地址:http://blog.csdn.net/xiao__gui/article/details/37874081

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!