本文共 3854 字,大约阅读时间需要 12 分钟。
在使用protobuf进行数据序列化和反序列化时,需要注意以下依赖管理:
protobuf-java,通常选择稳定版本进行使用。protobuf-java-util,提供对proto对象进行转换的便利方法。以下是Maven项目中常用的依赖配置:
com.google.protobuf protobuf-java 3.19.1 com.google.protobuf protobuf-java-util 3.19.1
在使用protobuf时,默认值的处理需要特别注意以下几点:
要将protobuf对象转换为JSON格式,可以使用JsonFormat工具。以下是常用操作步骤:
序列化过程:
// 获取打印器JsonFormat.Printer printer = JsonFormat.printer();// 定义打印规则printer.includingDefaultValueFields(); // 包含默认值字段printer.preservingProtoFieldNames(); // 保持原字段名称// 开始打印String userJsonStr = printer.print(user);
JSON字段名称与字段名的对应关系:
includingDefaultValueFields():决定是否包含默认值字段。preservingProtoFieldNames():决定是否使用proto文件中的原始字段名称。将JSON串转换为protobuf对象时,可以使用JsonFormat解析器:
解析过程:
// 获取解析器JsonFormat.Parser parser = JsonFormat.parser();// 定义解析规则parser.ignoringUnknownFields(); // 忽略未知字段// 开始解析UserProtoBuf.User.Builder userBuilder = UserProtoBuf.User.newBuilder();parser.merge(userJsonStr2, userBuilder);
字段处理规则:
ignoringUnknownFields():如果JSON中存在未知字段,选择忽略或抛出异常。以下是一个完整的实例说明,帮助您理解protobuf与JSON的转换流程。
proto文件定义:
syntax = "proto3";option java_outer_classname = "UserProtoBuf";message User { int32 age = 1; int64 timestamp = 2; bool enabled = 3; float height = 4; double weight = 5; string userName = 6; string Full_Address = 7;} 代码示例
import com.google.protobuf.util.JsonFormat;public class UserTest { public static void main(String[] args) throws Exception { // 模拟发送方数据 byte[] byteData = getClientPush(); // 反序列化为对象 UserProtoBuf.User user = UserProtoBuf.User.parseFrom(byteData); // 打印用户信息 System.out.println("用户信息:"); System.out.println(user); System.out.println("年龄:" + user.getAge()); System.out.println("时间戳:" + user.getTimestamp()); System.out.println("是否启用:" + user.getEnabled()); System.out.println("高度:" + user.getHeight()); System.out.println("重量:" + user.getWeight()); System.out.println("用户名:" + user.getUserName()); System.out.println("地址:" + user.getFullAddress()); // proto对象转JSON String userJsonStr = JsonFormat.printer() .includingDefaultValueFields() .print(user); System.out.println("\nJSON字符串:" + userJsonStr); // JSON转proto对象 String userJsonStr2 = "{\n" + " \"age\":18,\n" + " \"timestamp\":\"1698377283315\",\n" + " \"enabled\":false,\n" + " \"height\":1.8,\n" + " \"weight\":66.76,\n" + " \"userName\":\"赵云\"\n" + "}"; UserProtoBuf.User.Builder userBuilder = UserProtoBuf.User.newBuilder(); JsonFormat.parser() .ignoringUnknownFields() .merge(userJsonStr2, userBuilder); UserProtoBuf.User user1 = userBuilder.build(); System.out.println("\n转换后的用户对象:"); System.out.println(user1); } private static byte[] getClientPush() { UserProtoBuf.User.Builder user = UserProtoBuf.User.newBuilder(); user.setAge(18); user.setTimestamp(System.currentTimeMillis()); user.setEnabled(false); user.setWeight(66.76); user.setUserName("赵云"); return user.build().toByteArray(); }} includingDefaultValueFields()确保所有字段(包括默认值)都被包含在输出中。preservingProtoFieldNames()确保字段名称与proto文件中的定义一致。ignoringUnknownFields()来处理可能存在的未知字段,以避免异常。通过以上方法,您可以顺利地进行protobuf与JSON的转换操作,确保数据在双向传输过程中的准确性和完整性。
转载地址:http://bgxfk.baihongyu.com/