博客
关于我
protobuf使用详解
阅读量:795 次
发布时间:2023-03-04

本文共 3256 字,大约阅读时间需要 10 分钟。

Protobuf 简介及实战指南

什么是 Protobuf?

Protobuf(Protocol Buffers)是一种由谷歌开发的开源数据序列化和反序列化技术。它能够在语言和平台的限制下,高效地处理结构化数据的编码与解码。与传统的 XML 等技术相比,Protobuf 的数据量更小(约 3 到 10 倍)、传输速度更快(约 20 到 100 倍),同时实现了更高的灵活性和可扩展性。

为什么使用 Protobuf?

Protobuf 的主要优势在于其跨语言支持和高效率:

  • 语言无关:通过生成字节流,Protobuf允许不同语言间的数据互通,解决了跨语言通信的兼容性问题。
  • 效率高:数据序列化和反序列化过程中的开销极低,极大地提升了数据处理效率。
  • 可扩展性强:支持动态更新数据结构,减少了因数据格式变更导致的系统停机时间。
  • Protobuf 数据类型

    1. 基本数据类型

    Protobuf定义了多种基本数据类型,常见的包括:

    • string:字符串类型,默认为空字符串。
    • byte:单字节整数,默认为空字节。
    • bool:布尔值,默认为 false
    • int32/64:32 位和 64 位整数,数值默认为 0。
    • float/double:浮点数和双精度浮点数,数值默认为 0.0。
    • enum:枚举类型,默认值为第一个枚举值。

    2. 复杂数据类型

    Protobuf支持多种复杂数据类型,包括:

    • List(集合):通过 repeated 关键字定义可重复字段。
    • Map(映射表):支持键值对的映射,键和值可为任意类型。
    • 对象嵌套:允许在一个对象中嵌套另一个对象,实现复杂数据结构。

    3. Protobuf 在 Java 的应用

    在 Java 中使用 Protobuf,需要引入相关依赖:

    com.google.protobuf
    protobuf-java
    3.19.1

    集合 List 字段

    message User {    repeated int32 intList = 1;    repeated string strList = 2;}

    映射表 Map 字段

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

    实战示例

    创建 .proto 文件

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

    Java 类生成

    通过上述 .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();    }}

    引入外部 Protobuf 对象

    在 .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/

    你可能感兴趣的文章
    poj 3422 Kaka's Matrix Travels (费用流 + 拆点)
    查看>>
    Qt笔记——官方文档全局定义(二)Functions函数
    查看>>
    POJ 3468 A Simple Problem with Integers
    查看>>
    poj 3468 A Simple Problem with Integers 降维线段树
    查看>>
    poj 3468 A Simple Problem with Integers(线段树 插线问线)
    查看>>
    poj 3485 区间选点
    查看>>
    poj 3518 Prime Gap
    查看>>
    poj 3539 Elevator——同余类bfs
    查看>>
    Qt笔记——官方文档全局定义(三)Macros宏
    查看>>
    poj 3628 Bookshelf 2
    查看>>
    Qt笔记——官方文档全局定义(一)Types数据类型
    查看>>
    POJ 3670 DP LIS?
    查看>>
    POJ 3683 Priest John's Busiest Day (算竞进阶习题)
    查看>>
    POJ 3988 Selecting courses
    查看>>
    POJ 4020 NEERC John's inversion 贪心+归并求逆序对
    查看>>
    poj 4044 Score Sequence(暴力)
    查看>>
    POJ 基础数据结构
    查看>>
    POJ 题目3020 Antenna Placement(二分图)
    查看>>
    Poj(1797) Dijkstra对松弛条件的变形
    查看>>
    POJ--2391--Ombrophobic Bovines【分割点+Floyd+Dinic优化+二分法答案】最大网络流量
    查看>>