开发的时候,发现居然出现了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
通过以上步骤,你应该能够解决"Format '%x' invalid or"的错误,并恢复正常的设计工作。在使用Protel 99 SE或其他设计软件时,保持软件更新、理解文件格式和定期备份都是非常重要的实践,能帮助避免或减少不必要的...
**正文** JSPDF 是一个流行的JavaScript库,用于在客户端生成PDF文档。...在Web应用程序中,这种功能尤其有用,因为它提供了从网页直接创建文档的便利性。 ...它使用了Canvas元素来渲染图形,同时支持SVG(Scalable ...
InvalidSignature-The signature is invalid(解决方案).md
java.lang.IllegalStateException: Invalid name=“com.alibaba.dubbo.config.ProtocolConfig#0” contains illegal character, only digit, letter, ‘-’, ‘_’ or ‘.’ is legal 原因: 如果没有指定id属性,...
nc 命令的使用和错误解决办法 nc 命令是 Netcat 的缩写,是一个功能强大的网络实用工具,可以用于端口扫描、端口监听、文件传输、shell 反弹等多种场景中。在 Linux 系统中,nc 命令通常是通过 package netcat-...
在本场景中,用户遇到了“invalid install.log file”的错误,这通常发生在尝试卸载ArcGIS 9.3时,系统无法正确读取或验证安装日志文件。这个错误可能阻碍了卸载过程的正常进行,因此需要采取一些特殊的步骤来解决。...
在本案例中,我们遇到的问题是尝试卸载GIS 9.3时遇到了“invalid install.log file”的错误。这通常意味着在卸载过程中,系统无法找到或读取必要的安装日志文件,导致卸载过程受阻。 为了解决这个问题,我们需要...
两步,帮助大家很容易实现卸载。 (1)下载压缩包并解压得到install.log文件 (2)找到License的默认安转路径,找到卸载工具unwise32.exe,双击打开,选择(1)步下载的install.log文件,并点击next,即可实现完全...
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. ...
Invalid Request Format(解决方案).md
为了有效地解决这些问题,开发者需要进行Android闪退收集,以便定位并修复错误。以下是一些关于Android闪退收集的重要知识点: 1. **异常捕获与日志记录**: 当应用程序出现未处理的异常时,程序会崩溃。为了收集...
Delphi 10.3 ,程序运行到DataModule2.ClientDataSet1.ApplyUpdates(0);语句时,提示“Invalid parameter”错误
invalid_cache.csv
Altium Designer 19 原理图复制出现InvalidParameter at AdvSch.dll, Base Addre... 报错的解决办法
打开lisense manager的安装目录,点uninstall,选择下载的install。log,祝各位好运。当然也可以选择window install cleaner up移除。
invalid parameter type(解决方案).md
Invalid Command Line Argument(解决方案).md
jsPDF是由亚历山大·穆拉霍夫(Alexander Mulyakov)开发的开源库,其目标是提供一个完全在客户端生成PDF的解决方案。这个库可以处理文本、图像和基本的图形元素,让你能够创建自定义的PDF文档。jsPDF基于Unicode,...