Protobuf

作者: vvweilong | 来源:发表于2019-04-18 11:46 被阅读0次

今天看看ProtoBuf序列话工具,可以说它相对于 json 格式来说性能更好,传输数据量比较大的时候可以考虑使用 protobuf 。
Android Studio 中如何使用呢?
有两种方法 一:采用命令行编译后获取.java文件copy 到项目中进行使用
二:添加AS插件 在构建项目的时候进行编译并生成.java类文件。
由于我没有安装Xcode 所以想看看使用AS 的情况
https://github.com/protocolbuffers/protobuf/tree/master/java

首先 我们下载AS 的 protobuf 插件


创建 proto 目录

app build.gradle 中加入依赖


依赖
设置 sourceSets
 sourceSets {
        main {
            proto {
                //main目录新建proto目录
                srcDir 'src/main/proto'
                include '**/*.proto'
            }
            java {
                srcDir 'src/main/java'
            }
        }
    }

引入 gradle protobuf 插件

buildscript {
    repositories {
        google()
        jcenter()
        
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.2'
        classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.6'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

配置 task

protobuf { //protobuf生成的配置
    protoc {
        artifact = 'com.google.protobuf:protoc:3.2.0'
    }
    plugins {
        javalite {
            artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
        }
    }
    generateProtoTasks {
        all()*.plugins {
            javalite { }
        }
    }
}
创建 .proto源文件

编译后 创建一个 address.proto文件,根据文档语法编写结构信息

syntax = "proto2";// proto 版本

package tutorial;

option java_package = "com.example.tutorial";//自己项目的包名
option java_outer_classname = "AddressBookProtos";//生成.java的文件名
//Person 类型 编号必须不相同  否则会报错
message Person {
//required 必填项 序列化数据源必须提供  string 类型  对应 java String  编号1
  required string name = 1;
//required 必填项  int32 类型  对应 java int  编号2  
  required int32 id = 2;
//optional 可选项  string 类型  对应 java String  编号3
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }
//repeated 重复项 类似数组的形式 
  repeated PhoneNumber phones = 4;
}

message AddressBook {
  repeated Person people = 1;
}

Java 下的详细说明(翻墙)
rebuild 一下项目就可以再 build/generated/下找到 AddressBookProtos.java了

image.png
可以看到包名 与 .proto文件中 package 字段一致。

        try {
            //反序列化  将 byte[] 转为 java 类对象
            AddressBookProtos.Person person=
                    AddressBookProtos.Person.parseFrom(new byte[100]);
            //序列化一个 person 对象到 byte[]
            byte[] bytes = person.toByteArray();
            //徒手创建一个新的 person 对象
            AddressBookProtos.Person.Builder builder =
                    AddressBookProtos.Person.newBuilder();
            builder.setEmail("xxxxxx@.com");
            //......
            AddressBookProtos.Person newPerson = builder.build();

        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }

下一篇看一下 gradle 中编译 proto 的任务以及 proto 插件的相关知识吧

相关文章

网友评论

      本文标题:Protobuf

      本文链接:https://www.haomeiwen.com/subject/zdtawqtx.html