数据压缩:protobuf 的使用

本文概要:

  1. protobuf 是什么,与 json 区别
  2. protobuf 使用方式
  3. 性能对比
  4. 资料补充

protobuf 是什么

先看官方定义

protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。
Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。
你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序。

简单来说,protobuf 是一种比json、xml更高效的序列化方法,在数据请求方面性能更好。

数据对请求速度的影响分两方面,一是压缩率,二是解压序列化反序列化的速度。目前最流行的两种数据格式是 json 和 protobuf,json 是字符串,protobuf 是二进制,即使用各种压缩算法压缩后,protobuf 仍会比 json 小,数据量上 protobuf 有优势,序列化速度 protobuf 也有一些优势 。

protobuf 使用方式

引入插件

1. 在 project.gradle 中添加 gradle 插件

 dependencies {
    classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.13'
  }

2. 在 modle.gradle 中配置

apply plugin: 'com.google.protobuf'

protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:3.11.0'
    }
    generateProtoTasks {
        all().each { task ->
            task.builtins {
                java {
                    option "lite"
                }
            }
        }
    }
}

dependencies {
    implementation 'com.google.protobuf:protobuf-javalite:3.11.0'
}

3. 添加 Android studio 插件 - - Protocol Buffer Editor

数据压缩:protobuf 的使用_第1张图片

使用

1. 在 Java 同级目录下创建 proto 目录

数据压缩:protobuf 的使用_第2张图片

2. 编写实体类

// 指定语法版本
syntax = "proto3";

// 包名
option java_package = "com.enjoy.helloworldexample";

//对于c++即命名空间,对于java则为生成的类名Helloworld
package helloworld; 

// 生成 Helloworld.HelloRequest 类
message HelloRequest {
  string name = 1;
  int32 age = 2;
}

message HelloReply {
  //  repeated 对应 list
  repeated string message = 1;
}

3. 执行编译

下面这仨都行,编译一下才能生成对应的类,才能使用
数据压缩:protobuf 的使用_第3张图片

使用

Helloworld.HelloRequest helloRequest = Helloworld.HelloRequest.newBuilder()
    .setAge(18)
    .setName("linmu")
    .build();

//  序列化
byte[] bytes = helloRequest.toByteArray();

//  反序列化
try {
    Helloworld.HelloRequest request = Helloworld.HelloRequest.parseFrom(bytes);
} catch (InvalidProtocolBufferException e) {
    e.printStackTrace();
}

混淆配置

-keep class * extends com.google.protobuf.GeneratedMessageLite { *; }

protobuf 与 json 对比

下面代码是栗子:

public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() {

        Helloworld.HelloRequest helloRequest = Helloworld.HelloRequest
                .newBuilder()
                .setName("linmu")
                .setAge(18)
                .build();
        //获得序列化后数据大小
        int serializedSize = helloRequest.getSerializedSize();
        System.out.println("protobuf 序列化 : " + serializedSize);


        System.out.println("json 序列化 : " + "{\"name\":\"linmu\",\"age\":18}".getBytes().length);
    }
}

下面是执行结果

protobuf 序列化 : 9
json 序列化 : 25

Process finished with exit code 0

protobuf 资料补充

Protobuf数据结构

数据压缩:protobuf 的使用_第4张图片

你可能感兴趣的:(工具,java,protobuf,android)