protobuf java 注解_jprotobuf 1.0.3发布,简化java程序员对google protobuf的应用

jprotobuf是一个方便Java程序员使用的protobuf类库,它允许开发者通过注解直接定义protobuf字段,避免了.proto文件的操作。1.0.3版增加了从.proto文件动态生成对象支持。示例展示了如何进行序列化和反序列化操作,以及如何生成protobuf的IDL描述文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jprotobuf

A very useful utility library for java programmer using google protobuf

jprotobuf是针对Java程序开发一套简易类库,目的是简化java语言对protobuf类库的使用

使用jprotobuf可以无需再去了解.proto文件操作与语法,直接使用java注解定义字段类型即可。

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 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;

}

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 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代码。

联系我们

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值