java 序列化 protobuf_protobuf序列化实例(Java实现)

protobuf是google开源的序列化工具,他支持很多语言。这里介绍如何通过protobuf在java中做序列化。首先,我们需要准备protoc编译环境,这个是前提,我们写好了proto文件,当然需要生成对应的java类,这时候,就需要protoc-2.x.x-win32工具将其转为java类。这里我使用的是protoc-2.4.1-win32工具,这个在网上可以下载,下载之后,解压到本地,然后将/path/to/protoc路径加入环境变量的path变量中,这样,我们可以在命令行下运行protoc命令了。如下所示:

准备一个User.proto文件,内容如下,我们定一个User类,下面有4个属性,分别是id,name,age,mobile。

option java_outer_classname="UserProtoBuf";

option java_package="com.xxx.serial";

message User{

required int32 id=1;

required string name=2;

optional int32 age=3;

optional string mobile=4;

}

虽然语法和java有些区别,而且数据类型也不太一样,但是基本能够看得懂这个proto文件表示的含义。它指定了生成的java类名和对应的包名package,使用message关键字定义了User对象,最后定义了四个属性字段。

我们在命令行下通过如下命令,就可以生成一个Java类了:

E:\javaworkspace\javaee\src\main\java>protoc --java_out=. com\xxx\serial\User.proto

没有任何报错,那么生成的文件就是UserProtoBuf.java,截图如下:

接下来,我们需要在maven工程中加入protobuf-java依赖,我们要使用protoc创建的java类,必须要加入protobuf-java这个依赖。

com.google.protobuf

protobuf-java

2.6.1

最后,我们就通过一个测试类来使用我们序列化之后的UserProtoBuf类。

package com.xxx.serial;

import com.xxx.serial.UserProtoBuf.User;

public class UserProtoMain {

public static void main(String[] args) {

UserProtoBuf.User.Builder builder = UserProtoBuf.User.newBuilder();

builder.setId(1);

builder.setName("protoc-java");

builder.setAge(18);

builder.setMobile("15011186302");

User user = builder.build();

System.out.println(user.toString());

}

}

运行之后,打印信息如下:

这篇文章,简单介绍了如何从proto文件到java文件,再到使用生成的java文件做序列化的过程。在实际应用中,protobuf的数据类型比这个还要多,序列化可能更复杂。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Java中获取Redis中的Protobuf序列化数据,你需要使用Redis的Java客户端库和ProtobufJava库。以下是一个简单的示例代码,显示如何将Protobuf对象序列化并存储到Redis中,并从Redis中获取并反序列化Protobuf对象。 首先,确保你已经添加了Redis和Protobuf的相关依赖。 ```java import redis.clients.jedis.Jedis; import com.google.protobuf.InvalidProtocolBufferException; public class RedisProtobufExample { public static void main(String[] args) { // 创建一个Redis连接 Jedis jedis = new Jedis("localhost"); // 创建一个Protobuf对象 YourProtobufMessage message = YourProtobufMessage.newBuilder() .setId(1) .setName("John Doe") .setEmail("johndoe@example.com") .build(); // 将Protobuf对象序列化为字节数组 byte[] serializedMessage = message.toByteArray(); // 存储序列化的字节数组到Redis中 jedis.set("protobufData", serializedMessage); // 从Redis中获取序列化的字节数组 byte[] retrievedData = jedis.get("protobufData"); try { // 将字节数组反序列化Protobuf对象 YourProtobufMessage retrievedMessage = YourProtobufMessage.parseFrom(retrievedData); System.out.println(retrievedMessage); } catch (InvalidProtocolBufferException e) { e.printStackTrace(); } // 关闭Redis连接 jedis.close(); } } ``` 在上面的示例代码中,你需要替换`YourProtobufMessage`为你实际使用的Protobuf消息类型。你还需要根据你的Redis配置修改Redis连接的相关参数。 这是一个简单的例子,你可以根据自己的需求进行扩展和修改。希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值