Android中Protocol Buffers 的使用

  1. 在project的build.gradle中配置

    buildscript {
        
        repositories {
            google()
            jcenter()
            mavenCentral()
            maven { url "https://jitpack.io" }
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:3.1.2+'
            classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.2+'
        }
    }
    
  2. 在app的build.gradle中配置

    ...
    apply plugin: 'com.google.protobuf'
    ...
    
    android {
     ...
        sourceSets {
            main {
                proto {
                    //main目录新建proto目录
                    srcDir 'src/main/proto'
                    include '**/*.proto'
                }
                java {
                    srcDir 'src/main/java'
                }
            }
        }
     ...
    }
    
    dependencies {
     ...
     //protobuff库
     implementation 'com.google.protobuf:protobuf-java:3.5.0+'
     implementation 'com.google.protobuf:protoc:3.5.0+'
     ...
    }
    
    
    //构建task
    protobuf {
        protoc {
            artifact = 'com.google.protobuf:protoc:3.5.0+'
        }
    
        generateProtoTasks {
            all().each { task ->
                task.builtins {
                    remove java
                }
                task.builtins {
                    java {}
                    // Add cpp output without any option.
                    // DO NOT omit the braces if you want this builtin to be added.
                    cpp {}
                }
            }
        }
        //生成目录
        generatedFilesBaseDir = "$projectDir/src/generated"
    }
    
  3. 创建proto文件

    option java_package = "com.cheng.app";
    option java_outer_classname = "AddressBookProtos";
    message Person {
        required string name = 1;
        required int32 id = 2;
        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 PhoneNumber phone = 4;
    }
    
    message AddressBook {
        repeated Person person = 1;
    }
    
  4. 一个简单实例

    AddressBookProtos.Person.PhoneNumber pn = AddressBookProtos.Person.PhoneNumber.newBuilder()
                    .setNumber("18202745852")
                    .setType(AddressBookProtos.Person.PhoneType.HOME)
                    .build();
            AddressBookProtos.Person person = AddressBookProtos.Person.newBuilder()
                    .setId(1)
                    .setName("text")
                    .setEmail("123")
                    .addPhone(pn)
                    .build();
            try {
                long start = System.currentTimeMillis();
                //编码
                byte[] bytes = person.toByteArray();
                //解码测试
                AddressBookProtos.Person p = AddressBookProtos.Person.parseFrom(bytes);
                System.out.println("================== start =================");
                System.out.println(p.getEmail());
                System.out.println(p.getPhone(0).getNumber());
                System.out.println("\n=========== PhoneNumber ============");
                System.out.println(phoneNumber);
                System.out.println("===========  Person ===========");
                System.out.println(p);
                System.out.println("excute time is:" + (System.currentTimeMillis() - start));
            } catch (InvalidProtocolBufferException e) {
                e.printStackTrace();
            }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值