当前位置:   article > 正文

记一次 protobuf-javalite 实践

com.google.protobuf:protoc-gen-javalite
环境

windows 10 AndroidStudio 3.0.1 protobuf-javalite 版本

初始配置
1. project.gradle
  1. dependencies {
  2. classpath 'com.android.tools.build:gradle:3.0.1'
  3. // protobuf支持版本,AS3.0必须用0.8.2以上
  4. classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.8'
  5. // NOTE: Do not place your application dependencies here; they belong
  6. // in the individual module build.gradle files
  7. }
  8. 复制代码
2. modle.gradel
  1. apply plugin: 'com.google.protobuf'
  2. android {
  3. sourceSets {
  4. main {
  5. proto {
  6. srcDir 'src/main/proto' //proto文件所在路径
  7. include '**/*.proto'
  8. }
  9. java {
  10. srcDir 'src/main/java'
  11. }
  12. }
  13. }
  14. }
  15. protobuf {
  16. protoc {
  17. // You still need protoc like in the non-Android case
  18. artifact = 'com.google.protobuf:protoc:3.0.0'
  19. }
  20. plugins {
  21. javalite {
  22. // The codegen for lite comes as a separate artifact
  23. artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
  24. }
  25. }
  26. generateProtoTasks {
  27. all().each { task ->
  28. task.builtins {
  29. // In most cases you don't need the full Java output
  30. // if you use the lite output.
  31. remove java
  32. }
  33. task.plugins {
  34. javalite { }
  35. }
  36. }
  37. }
  38. //将会在 "$projectDir/src/generated"这个目录中自动生成对应的java文件
  39. generatedFilesBaseDir = "$projectDir/src/generated"
  40. }
  41. dependencies {
  42. compile 'com.google.protobuf:protobuf-lite:3.0.0'
  43. }
  44. 复制代码
3. AndroidStudio中安装插件:

4. 编写.proto文件

因为在gradle中设置了proto文件的可编译目录,所以需要在这个目录中编写.proto文件 (参考网上教程写了proto文件,但具体网址不记得了,不好意思,如果需要我会备注)

  1. syntax = "proto3";
  2. package tutorial;
  3. option java_package = "com.je.pro.test";
  4. option java_outer_classname = "ResponsePB";
  5. message Tab {
  6. int32 type = 1;
  7. string f = 2;
  8. }
  9. message ItemData {
  10. string sname = 1;
  11. string packageid = 2;
  12. repeated Tab tabs = 45;
  13. }
  14. message DataItem {
  15. int32 datatype = 1;
  16. ItemData itemdata = 2;
  17. }
  18. message Response {
  19. repeated DataItem data = 1;
  20. bool hasNextPage = 2;
  21. string dirtag = 3;
  22. }
  23. 复制代码

初次使用,proto的语法都是参考网上教程,若有失误,谢谢指正。 写完后,点击

即可自动生成java文件。

生成目录结构:

数据生成和解析
1. 数据生成

代码:

  1. public byte[] testGetBytes(){
  2. ResponsePB.Tab.Builder tabBuilder = ResponsePB.Tab.newBuilder().setF("sss").setType(2);
  3. ResponsePB.ItemData.Builder itemData = ResponsePB.ItemData.newBuilder();
  4. itemData.setPackageid("222222");
  5. itemData.setSname("eiiii");
  6. itemData.addTabs(tabBuilder);
  7. ResponsePB.Response.Builder responseBuilder = ResponsePB.Response.newBuilder();
  8. responseBuilder.setHasNextPage(true);
  9. responseBuilder.setDirtag("soft");
  10. ResponsePB.DataItem.Builder dataItem = ResponsePB.DataItem.newBuilder().setDatatype(1).setItemdata(itemData);
  11. ResponsePB.Response response = responseBuilder.addData(dataItem).build();
  12. System.out.println(response.toString());
  13. byte[] out = response.toByteArray();
  14. return out;
  15. }
  16. 复制代码

打印出

  1. data {
  2. datatype: 1
  3. itemdata {
  4. packageid: "222222"
  5. sname: "eiiii"
  6. tabs {
  7. f: "sss"
  8. type: 2
  9. }
  10. }
  11. }
  12. dirtag: "soft"
  13. has_next_page: true
  14. 复制代码
1. 解析

代码:

  1. public void testDeBytes(){
  2. byte[] out = testGetBytes();
  3. try {
  4. ResponsePB.Response test = ResponsePB.Response.parseFrom(out);
  5. System.out.println(test.getData(0));
  6. } catch (InvalidProtocolBufferException e) {
  7. e.printStackTrace();
  8. }
  9. }
  10. 复制代码

打印出:

  1. datatype: 1
  2. itemdata {
  3. packageid: "222222"
  4. sname: "eiiii"
  5. tabs {
  6. f: "sss"
  7. type: 2
  8. }
  9. }
  10. 复制代码

这样简单的应用就完成了。

项目中遇到问题与解决:

  1. 需要重利用数据:option allow_alias = true;
  1. enum Test{
  2. option allow_alias = true;
  3. test_value=2;
  4. duplicate_test_value=2;
  5. }
  6. 复制代码

原本在enum中不能定义相同的值,但加入option allow_alias = true; 就可以了

  1. repeated变量使用 正确方式
  1. ResponsePB.Tab.Builder tabBuilder = ResponsePB.Tab.newBuilder().setF("sss").setType(2);
  2. ResponsePB.ItemData.Builder itemData = ResponsePB.ItemData.newBuilder();
  3. itemData.addTabs(tabBuilder);
  4. 复制代码

错误方式

  1. ResponsePB.Tab.Builder tabBuilder = ResponsePB.Tab.newBuilder().setF("sss").setType(2);
  2. ResponsePB.ItemData.Builder itemData = ResponsePB.ItemData.newBuilder();
  3. itemData.setTabs(0,tabBuilder);
  4. 复制代码

报异常:

  1. java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
  2. at java.util.ArrayList.rangeCheck(ArrayList.java:653)
  3. at java.util.ArrayList.set(ArrayList.java:444)
  4. at com.google.protobuf.ProtobufArrayList.set(ProtobufArrayList.java:96)
  5. at com.je.pro.test.ResponsePB$ItemData.setTabs(ResponsePB.java:590)
  6. at com.je.pro.test.ResponsePB$ItemData.access$1500(ResponsePB.java:429)
  7. at com.je.pro.test.ResponsePB$ItemData$Builder.setTabs(ResponsePB.java:881)
  8. at com.je.pro.ExampleUnitTest.testByte(ExampleUnitTest.java:91)
  9. 复制代码

这个异常可以参考ArrayList.set() 方法,不要怀疑,我真的直接set了 附上ArrayList add() set() 源码

  1. /**
  2. * Replaces the element at the specified position in this list with
  3. * the specified element.
  4. *
  5. * @param index index of the element to replace
  6. * @param element element to be stored at the specified position
  7. * @return the element previously at the specified position
  8. * @throws IndexOutOfBoundsException {@inheritDoc}
  9. */
  10. public E set(int index, E element) {
  11. if (index >= size)
  12. throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
  13. E oldValue = (E) elementData[index];
  14. elementData[index] = element;
  15. return oldValue;
  16. }
  17. /**
  18. * Appends the specified element to the end of this list.
  19. *
  20. * @param e element to be appended to this list
  21. * @return <tt>true</tt> (as specified by {@link Collection#add})
  22. */
  23. public boolean add(E e) {
  24. ensureCapacityInternal(size + 1); // Increments modCount!!
  25. elementData[size++] = e;
  26. return true;
  27. }
  28. 复制代码
参考网站

developers.google.com/protocol-bu… github.com/google/prot… github.com/protocolbuf…

转载于:https://juejin.im/post/5ca1e216e51d4540753c34ed

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/246958
推荐阅读
相关标签
  

闽ICP备14008679号