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
相关推荐
0.0.0 VScode插件platformIO开发环境的安装[esp32、8266]_̌萌新历险记的博客-CSDN博客.mhtml
五一数学建模
人工智能大模型体验报告3.0 目录 大模型产品测评综述 大模型产品现状与进程 3 .0版本大模型测评规则 大模型厂商整体测评 3.0版本大模型综合指数 3.0版本 测评细分维度指数及评述 测评题目展示 厂商最佳实践案例 厂商优秀案例展示 人工 智能大模型体验报告3.0.pdf (1.39 MB, 需要: RMB 9 元)
使用opencv进行人脸识别和对比-python源码.zip
触屏版自适应手机wap软件网站模板 触屏版自适应手机wap软件网站模板
基于matlab实现的GST模型的红外弱小目标检测代码.rar
LMDI(对数平均迪氏指数法)目前在能源消耗、碳排放等领域应用很多,总体来说并不 是一个很难的方法,但是相应的资料、步骤还是比较少。本人在写论文的时候,通过搜集资 料、研究,找到了stata的实现方法,来自于 Kerry Du老师写的一个模块l dmi,网址为: LMDI: Stata module to compute L ogarithmic Mean Divisia Index (LMDI) Dec omposition (repec.org) 大家可以自己去研究一下。对应的参考 文献就是Ang, B.W., 2005. The LMDI approach t odecomposition analysis: a practical gui de. Energy Policy 33, 867–871. 目前LMDI分解基 本都以这篇文献为参考,论坛里也有,大家可以下载去深入研究一下,总体并不难。 但是 对于LMDI方法的解读以及stata实现的步骤、过程,目前基本没有具体的中文资料 。 本文在写论文的过程中,进行了总结,现上传上来供大家参考,里面包括stata的 程序文件(ado
IEC 60695-11-2-2017 第11-2部分:试验火焰——1kW标称预混合火焰——装置、验证试验安排和指南.pdf
基于matlab实现的拉普拉斯金字塔分解 做毕业设计的可以参考,小波变换以及MGA的初级参考.rar
本文档是课题研究的研究报告内含调研以及源码设计以及结果分析
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
制造企业数字化转型ERP与CRM系统集成定位及场景构建方案.pptx
触屏版自适应手机wap软件网站模板 触屏版自适应手机wap软件网站模板
【课程设计全套资料】基于JAVA的管理系统
IEC 60730-2-13-2017.pdf
机械设计谷物洗涤机sw12非常好的设计图纸100%好用.zip
2000—2022年东中西分区域空间权重矩阵,省级层面,具体包括01矩阵,经济矩 阵,地理矩阵,经济地理矩阵以及经济地理嵌套矩阵,包含原始数据和计算过程,经济地理 权重矩阵采用2000-2022年数据,可以更改研究期间,里面有计算过程,地理距离 是用的欧式距离,如有疑问可与我私聊哈,大家放心下载。
TMCM-0930-TMCL 硬件手册
软件说明:先将要合并的.PDF类型文件放到一个文件夹里,然后点击”选择文件夹“选择它,再点击合并,确定存放位置确定后即可成功合并一个PDF类型的文件。在 Python 中,可以使用 PyPDF2 库来合并 PDF 文件。用 pip install PyPDF2 命令来安装这个库。
一、最短路径的概念及应用 在介绍最短路径之前我们首先要明白两个概念:什么是源点,什么是终点?在一条路径中,起始的第 一个节点叫做源点;终点:在一条路径中,最后一个的节点叫做终点;注意!源点和终点都只是相对 于一条路径而言,每一条路径都会有相同或者不相同的源点和终点。 而最短路径这个词不用过多解释,就是其字面意思: 在图中,对于非带权无向图而言, 从源点到终点 边最少的路径(也就是 BFS 广度优先的方法); 而对于带权图而言, 从源点到终点权值之和最少的 路径叫最短路径; 最短路径应用:道路规划; 我们最关心的就是如何用代码去实现寻找最短路径, 通过实现最短路径有两种算法:Dijkstra 迪杰斯 特拉算法和 Floyd 弗洛伊德算法, 接下来我会详细讲解 Dijkstra 迪杰斯特拉算法;