当前位置: 代码迷 >> 嵌入开发 >> Invalid embedded descriptor for "proto"Dependencies passed (Protobufer)解决方法
  详细解决方案

Invalid embedded descriptor for "proto"Dependencies passed (Protobufer)解决方法

热度:669   发布时间:2016-04-25 08:43:51.0
Invalid embedded descriptor for ".proto".Dependencies passed (Protobufer)解决办法

前言

  之前开发的时候,发现居然出现了Dependencies passed to FileDescriptor.buildFrom() don't match those listed in the FileDescriptorProto.的错误,还有Protocol Buffers Invalid embedded descriptor problem等错误,上网google了很久也没找到解决方法,最终经过设断点找官方文档,才把问题解决了。然后分享下解决问题的方法和过程。


一、找到出现bug的原因

  看到报错了之后,就去设断点,用debug模式,弄明白为什么会出问题,通过设断点知道if (!dependencies[i].getName().equals(proto.getDependency(i))) {这里出现问题了,原因是两个地方的依赖不一样,这个涉及到proto文件的命名空间Package,import引入的文件,生成的java包路径等问题。因为两个值不相等,所以找到问题的原因所在,然后去看了自己的proto文件。一个是这样的:

import "descriptor.proto";package com.pwrd.zs;extend google.protobuf.MessageOptions {  optional int32 msgid = 54321;}

另一个是谷歌的descriptor.proto文件,由于这个文件的import和package没有正确使用,所以有问题,会报错!

package google.protobuf;option java_package = "com.google.protobuf";option java_outer_classname = "DescriptorProtos";


二、解决问题

  1、java包路径和proto文件的命名空间。只要统一两边的依赖和命名空间以及正确设置好java包路径即可,在proto文件中,如果存在package声明无java_package声明,则说明该proto文件所在命名空间和生成的java包路径是一样的,如果有java_package则这个声明的为生成的java包路径,pacakge则只表示proto文件的命名空间,不表示java包路径!

  2、两个文件的依赖关系(import)。即import引用的文件代表依赖关系,且import引用的要在对应的命名空间里引用,比如两个文件都在同个目录下,可以直接引用import "descriptor.proto",但是由于第一个文件的package命名空间是在google.protobuf里面,所以实际上是引用不到的,这样就会出问题,只要将descriptor.proto文件放在其google文件夹下的protobuf的文件夹下即可,然后import  “google/protobuf/descriptor.proto”,这样就解决了第二个问题!

  最后结果如下:

import "google/protobuf/descriptor.proto";option java_package = "com.pwrd.zs.common.msg";option java_outer_classname = "Options";extend google.protobuf.MessageOptions {  optional int32 msgid = 54321;}



三、总结

  由于历史遗留下的问题,将两个proto放在同个目录下,然后package不一致出现了错误,没有正确理解package命名空间和import的概念及对应的生成的java包路径,造成了一些问题,实际上理解了之后还是很简单的。以后要吸取教训。

  全文完。。。。

    

  

  

    



  相关解决方案