本文共 3256 字,大约阅读时间需要 10 分钟。
Protobuf(Protocol Buffers)是一种由谷歌开发的开源数据序列化和反序列化技术。它能够在语言和平台的限制下,高效地处理结构化数据的编码与解码。与传统的 XML 等技术相比,Protobuf 的数据量更小(约 3 到 10 倍)、传输速度更快(约 20 到 100 倍),同时实现了更高的灵活性和可扩展性。
Protobuf 的主要优势在于其跨语言支持和高效率:
Protobuf定义了多种基本数据类型,常见的包括:
false。Protobuf支持多种复杂数据类型,包括:
repeated 关键字定义可重复字段。在 Java 中使用 Protobuf,需要引入相关依赖:
com.google.protobuf protobuf-java 3.19.1
message User { repeated int32 intList = 1; repeated string strList = 2;} message User { map intMap = 4; map stringMap = 5;} message User { string userName = 1; repeated User innerObjectList = 2;}message User { string name = 1; int32 age = 2; string code = 3;} syntax = "proto3";message User { int32 age = 1; int64 timestamp = 2; bool enabled = 3; float height = 4; double weight = 5; string userName = 6; string fullAddress = 7;} 通过上述 .proto 文件,可以自动生成对应的 Java 类。注意:如果不指定包路径,生成的类会放在默认路径,需要手动导入包。
public class UserTest { public static void main(String[] args) throws Exception { byte[] byteData = getClientPush(); System.out.println("字节数据长度: " + byteData.length); System.out.println("用户信息: " + new UserProtoBuf.User().parseFrom(byteData).toString()); } private static byte[] getClientPush() throws Exception { UserProtoBuf.User user = UserProtoBuf.User.newBuilder() .setAge(18) .setTimestamp(System.currentTimeMillis()) .setEnabled(true) .setWeight(66.76) .setUserName("赵云") .setFullAddress("王者-打野") .build(); return user.toByteArray(); }} 在 .proto 文件中引入外部对象:
syntax = "proto3";import "User.proto";message Demo2Object { string userName = 1; repeated User userList = 2;} public class Demo2ObjectTest { public static void main(String[] args) throws Exception { byte[] byteData = getClientPush(); System.out.println("字节数据长度: " + byteData.length); System.out.println("用户列表: " + new Demo2ObjectProtoBuf.Demo2Object().parseFrom(byteData).toString()); } private static byte[] getClientPush() throws Exception { UserProtoBuf.User user = UserProtoBuf.User.newBuilder() .setAge(18) .setTimestamp(System.currentTimeMillis()) .setEnabled(true) .setWeight(66.76) .setUserName("赵云") .build(); List userList = Arrays.asList(user, user); Demo2ObjectProtoBuf.Demo2Object demo2Object = Demo2ObjectProtoBuf.Demo2Object.newBuilder() .setUserName("赵云") .addAllUserList(userList) .build(); return demo2Object.toByteArray(); }} 转载地址:http://ugxfk.baihongyu.com/