开发的时候,发现居然出现了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包路径,造成了一些问题,实际上理解了之后还是很简单的。以后要吸取教训。
http://www.cnblogs.com/riskyer/archive/2013/09/05/3303961.html
相关推荐
NULL 博文链接:https://wilian.iteye.com/blog/1992365
jspdf html页面生成pdf j jspdf html页面生成pdfspdf html页面生成pdf
大家在使用Protel 99 SE时在导入自定义库时是否经常遇到莫名其妙的弹窗 'Format '%x' invalid or 问题,此资源提供了彻底解决此问题的办法,内有解决工具和说明文件。
java.lang.IllegalStateException: Invalid name=“com.alibaba.dubbo.config.ProtocolConfig#0” contains illegal character, only digit, letter, ‘-’, ‘_’ or ‘.’ is legal 原因: 如果没有指定id属性,...
两步,帮助大家很容易实现卸载。 (1)下载压缩包并解压得到install.log文件 (2)找到License的默认安转路径,找到卸载工具unwise32.exe,双击打开,选择(1)步下载的install.log文件,并点击next,即可实现完全...
install.log文件,找到卸载工具unwise32.exe,双击打开,即可实现方便轻松干净完全卸载。
cmake-3.18.1 64位安装包。官网下载的。
331 Password required for 123. PASS xxxxxx 230 User 123 logged in. SYST 215 Windows_NT PWD 257 "/" is current directory. TYPE A 200 Type set to A. PORT 192,168,1,100,17,228 500 Invalid PORT Command. ...
Android闪退收集
invalid_cache.csv
Altium Designer 19 原理图复制出现InvalidParameter at AdvSch.dll, Base Addre... 报错的解决办法
打开lisense manager的安装目录,点uninstall,选择下载的install。log,祝各位好运。当然也可以选择window install cleaner up移除。
使用的jsPDF插件,将Html转PDF文件,分享出来,希望对大家能有帮助,下载后直接引用资源开始转换之旅。
cmake-3.18.2.tar.gz源码,官网下载太慢,这个备份一下,顺便给大家留一份。
Dialogue System for Unity 2.1.2(u2018.1.0)可以轻松地为您的游戏添加交互式对话和任务。 它是一个完整,强大的解决方案,包括基于可视节点的编辑器,对话UI,过场动画,任务日志,保存/加载等。 核心是一个精简,...
3.the use of axis boundary conditions is not appropriate for 2D/3D flow problem. 4.error:divergence detected in AMG solver 5.error:temperature divergence detected in AMG solver 6.turbulent viscosity...
invalid multibyte character sequence 870告警1
format ' x' invalid or incompatible with argument 解决办法
Stanford CoreNLP Python绑定 该软件包包含由生成的的protobuf规范的python绑定。 这些绑定可用于解析由例如生成的二进制数据。 用法: from corenlp_protobuf import Document , parseFromDelimitedString# ...
强烈推荐,arcgis卸载出现,install.log文件复制到bin目录,找到卸载工具unwise32.exe