jprotobuf
A very useful utility library for java programmer using google protobuf
jprotobuf是针对Java程序开发一套简易类库,目的是简化java语言对protobuf类库的使用
使用jprotobuf可以无需再去了解.proto文件操作与语法,直接使用java注解定义字段类型即可。
JProtobuf官方网址:https://github.com/jhunters/jprotobuf
1.0.0 支持普通类型,嵌套对象以及对象数组的Protobuf协议的序列化与反序列化实现。
1.0.1 由注解对象动态生成Protobuf的IDL描述文件内容。
1.0.3 增加由.proto 描述文件动态生成Protobuf操作对象的支持,详见下面使用说明。
环境要求
JDK 6 或以上版本
API使用说明
示例:假如需要定义protobuf定义一个数据接口,包含两个属性,一个是string,一个是int32
传统protobuf使用过程
a 定义.proto说明文件. test.proto
package pkg;
option java_package = "com.baidu.bjf.remoting.protobuf";
//这里声明输出的java的类名
option java_outer_classname = "SimpleTypeTest";
message InterClassName {
required string name = 1;
required int32 value = 2;
}
b 使用protoc.exe 编译.proto文件
protoc --java_out=src test.proto
c 编译生成的Java文件,利用protobuf API进行序列化与反序化操作
序列化操作:
InterClassName icn = InterClassName.newBuilder().setName("abc")
.setValue(100).build();
byte[] bb = icn.toByteArray();
反序化操作
byte[] bb = ...;
InterClassName icn = InterClassName.parseFrom(bb);
使用jprotobuf API 简化开发
a 使用注解直接使用pojo对象
import com.baidu.bjf.remoting.protobuf.FieldType;
import com.baidu.bjf.remoting.protobuf.annotation.Protobuf;
/**
* A simple jprotobuf pojo class just for demo.
*
* @author xiemalin
* @since 1.0.0
*/
public class SimpleTypeTest {
@Protobuf(fieldType = FieldType.STRING, order = 1, required = true)
private String name;
@Protobuf(fieldType = FieldType.INT32, order = 2, required = false)
private int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
b 使用jprotobuf API进行序列化与反序列化操作
Codec<SimpleTypeTest> simpleTypeCodec = ProtobufProxy
.create(SimpleTypeTest.class);
SimpleTypeTest stt = new SimpleTypeTest();
stt.name = "abc";
stt.setValue(100);
try {
// 序列化
byte[] bb = simpleTypeCodec.encode(stt);
// 反序列化
SimpleTypeTest newStt = simpleTypeCodec.decode(bb);
} catch (IOException e) {
e.printStackTrace();
}
嵌套对象的开发示例
public class AddressBookProtosPOJO {
@Protobuf(fieldType = FieldType.OBJECT, order=1, required = false)
public Person person;
@Protobuf(fieldType = FieldType.OBJECT, order=2, required = false)
public List<Person> person;
}
public class Person {
@Protobuf(fieldType = FieldType.STRING, order=1, required = true)
public String name;
@Protobuf(fieldType = FieldType.INT32, order=2, required = true)
public int id;
@Protobuf(fieldType = FieldType.STRING, order=3, required = false)
public String email;
@Protobuf(fieldType = FieldType.DOUBLE, order=4, required = false)
public Double doubleF;
@Protobuf(fieldType = FieldType.FLOAT, order=5, required = false)
public Float floatF;
@Protobuf(fieldType = FieldType.BYTES, order=6, required = false)
public byte[] bytesF;
@Protobuf(fieldType=FieldType.BOOL, order=7, required=false)
public Boolean boolF;
}
由注解对象动态生成Protobuf的IDL描述文件内容
JProtobuf提供一个非常实用的功能,可以动态生成Protobuf的IDL描述文件内容
//返回的内容即为 Protobuf的IDL描述文件
String code = ProtobufIDLGenerator.getIDL(SimpleTypeTest.class);
public class SimpleTypeTest {
@Protobuf(fieldType = FieldType.STRING, order = 1, required = true)
private String name;
@Protobuf(fieldType = FieldType.INT32, order = 2, required = false)
private int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
增加由.proto 描述文件动态生成Protobuf操作对象的支持
JProtobuf提供一个更简单的功能,可支持动态Protobuf对象的生成功能,省去了注释的使用 基本使用示例如下:
@Test
public void testDecode() throws Exception {
// 通过 .proto描述文件生成动态解析对象
String protoCotent = "package mypackage.test; " +
"option java_package = \"com.baidu.bjf.remoting.protobuf.simplestring\";" +
"option java_outer_classname = \"StringTypeClass\"; " +
"message StringMessage { " +
" required string message = 1; }" ;
IDLProxyObject object = ProtobufIDLProxy.createSingle(protoCotent);
//if .proto IDL defines multiple messages use as follow
//Map<String, IDLProxyObject> objects = ProtobufIDLProxy.create(protoCotent);
// 动态设置字段值
object.put("message", "hello你好");
//propogation object set
//object.put("sub.field", "hello world");
// protobuf 序列化
byte[] bb = object.encode();
// protobuf 反序列化
IDLProxyObject result = object.decode(bb);
Assert.assertEquals("hello你好", result.get("message"));
//propogation object get
//result.get("sub.field")
}
更多使用示例请参见testcase代码。
联系我们
email: rigel-opensource@baidu.com
相关推荐
jama-1.0.3.jar就是这样一款专门为Java设计的线性代数库,它为开发者提供了进行矩阵操作的基础工具,简化了与矩阵运算相关的编程工作。 一、jama包介绍 jama全称为Java Matrix Package,是由Lawrence Livermore ...
标题中的"Jama-1.0.3_java_Framework_matrix_"揭示了这是Jama的1.0.3版本,一个基于Java的矩阵计算框架,其核心功能是处理矩阵相关的数学问题。 在描述中提到的"矩阵源代码,矩阵求解,简单好用",意味着Jama提供了...
JAVA版jieba 1.0.3-SNAPSHOT最新版本jar包。。把它导入idea项目,添加到library和module就可以用啦,导入eclipse项目就更简单了不用我说了吧
标题“org.sf.feeling.decompiler_1.0.3-java反编译”揭示了该工具的主要功能,即对Java字节码进行反编译,生成接近原始的Java源代码。这个工具特别适用于开发者需要理解或修改无法直接获取源码的第三方库的情况。 ...
标签:googlecode、juniversalchardet、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准...
标题中的"jfreechart-1.0.3.jar"指的是JFreeChart库的1.0.3版本的Java归档(JAR)文件,这个文件包含了所有必要的类和资源,使得开发人员可以在他们的Java应用程序中集成丰富的图表功能。描述中提到的"含1.0.3的API...
Java混淆器是开发人员在发布Java应用程序时常常使用的工具,主要目的是为了保护代码不被轻易反编译和理解。Jocky1.0.3(原名JOC)是一款这样的混淆器,它提供了对Java代码的混淆功能,有助于增强代码的安全性。这个...
protobuf.zip这个压缩包包含了与Google Protocol Buffers(protobuf)和gRPC相关的工具及示例文件。Protocol Buffers是一种数据序列化协议,它允许开发者定义数据结构,并在各种数据平台之间交换这些数据。gRPC则是...
标签:googlecode、juniversalchardet、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明...
【KEmulator 1.0.3 modded】是一款基于Java技术开发的模拟器引擎,专为运行Java应用程序而设计。这款模拟器经过修改优化,提供了更高效、更稳定的性能,使得用户可以在个人电脑上流畅地运行各种Java游戏和应用。 在...
为了在Java项目中更便捷地使用Echarts3,通常我们会对其进行简单的封装,以便于在后端生成JSON数据,然后在前端展示图表。本文将详细介绍如何在Java环境中对Echarts3进行封装,并给出具体的示例。 首先,我们需要...
总之,JAMA作为Java平台上的一个基础线性代数库,不仅简化了矩阵运算,还为大数据数学中的复杂计算提供了强大的工具集。无论是在科研项目、教育环境还是企业应用中,JAMA都是一款不可或缺的Java矩阵处理库。通过理解...
swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3...
"CreatorSuiteAPI-1.0.3_java_CreatorsuiteAPI_creatorsuiteapi_stepp" 是一个特定版本的 CreatorSuite API,专为Windows操作系统设计。这个API(应用程序接口)允许开发者通过编程方式与Creatorsuite软件进行交互,...
补丁生成器 v1.0.3 是一个专为Java程序员设计的实用工具,它集成了版本控制系统SVN,旨在简化程序更新过程,通过只针对修改过的代码生成补丁,而不是进行全量更新,从而极大地提高了开发团队的工作效率。这款工具...
Java矩阵学习包JAMA-1.0.3.jar是一个专门用于矩阵运算的库,它为Java程序员提供了一个方便、高效的方式来处理线性代数问题。这个库被广泛应用于机器学习、数据分析、科学计算以及工程计算等领域,因为它简化了复杂的...
【eXtremeComponents-1.0.3】是一个软件组件包,它的出现是为了提供一套高效、易用的开发工具,以帮助程序员在构建应用程序时提高生产力和代码质量。这个版本1.0.3是该组件集合的一个稳定版本,用户反馈良好,表明它...
总结来说,XDoclet Plugins 1.0.3是开发者提高效率,简化Java EE和ORM框架配置的重要工具。通过理解并熟练运用其提供的插件,开发团队可以专注于业务逻辑,而非繁琐的配置工作,从而提升项目的开发速度和质量。同时...
10、在 v1.0.3 中简化了所有参数的名称,让使用变得更加简单(用更少的代码,就能实现更复杂的效果)。 11、本次发布的动画控制器文件为min版,大大减少了文件的体积(下载解压后,文件位置在:js/swiper.animate....
享应用 v1.0.3.zip 是一个专为PC用户设计的辅助工具,它简化了在计算机上下载和安装手机应用的过程。这个压缩包包含了两个主要文件:XYY.exe 和说明.htm。 XYY.exe 文件是享应用的主要执行程序,它是应用程序的可...