开发的时候,发现居然出现了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
相关推荐
通过以上步骤,你应该能够解决"Format '%x' invalid or"的错误,并恢复正常的设计工作。在使用Protel 99 SE或其他设计软件时,保持软件更新、理解文件格式和定期备份都是非常重要的实践,能帮助避免或减少不必要的...
**正文** JSPDF 是一个流行的JavaScript库,用于在客户端生成PDF文档。...在Web应用程序中,这种功能尤其有用,因为它提供了从网页直接创建文档的便利性。 ...它使用了Canvas元素来渲染图形,同时支持SVG(Scalable ...
NULL 博文链接:https://wilian.iteye.com/blog/1992365
java.lang.IllegalStateException: Invalid name=“com.alibaba.dubbo.config.ProtocolConfig#0” contains illegal character, only digit, letter, ‘-’, ‘_’ or ‘.’ is legal 原因: 如果没有指定id属性,...
在本案例中,我们遇到的问题是尝试卸载GIS 9.3时遇到了“invalid install.log file”的错误。这通常意味着在卸载过程中,系统无法找到或读取必要的安装日志文件,导致卸载过程受阻。 为了解决这个问题,我们需要...
在本场景中,用户遇到了“invalid install.log file”的错误,这通常发生在尝试卸载ArcGIS 9.3时,系统无法正确读取或验证安装日志文件。这个错误可能阻碍了卸载过程的正常进行,因此需要采取一些特殊的步骤来解决。...
两步,帮助大家很容易实现卸载。 (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. ...
为了有效地解决这些问题,开发者需要进行Android闪退收集,以便定位并修复错误。以下是一些关于Android闪退收集的重要知识点: 1. **异常捕获与日志记录**: 当应用程序出现未处理的异常时,程序会崩溃。为了收集...
invalid_cache.csv
Altium Designer 19 原理图复制出现InvalidParameter at AdvSch.dll, Base Addre... 报错的解决办法
Invalid Multibyte Character Sequence 警告解析 在编程中,特别是在嵌入式系统开发中,我们经常会遇到Invalid Multibyte Character Sequence 警告。这个警告通常来自于编译器,告知我们存在非法的多字节字符序列。...
InvalidSignature-The signature is invalid(解决方案).md
打开lisense manager的安装目录,点uninstall,选择下载的install。log,祝各位好运。当然也可以选择window install cleaner up移除。
jsPDF是由亚历山大·穆拉霍夫(Alexander Mulyakov)开发的开源库,其目标是提供一个完全在客户端生成PDF的解决方案。这个库可以处理文本、图像和基本的图形元素,让你能够创建自定义的PDF文档。jsPDF基于Unicode,...
Android的MQTT消息推送接收所需jar包,修复了MqttAndroidClient会出现throw new IllegalArgumentException Invalid ClientHandle报错,而源github中代码未更新解决,所以经过重新编译,生成新的jar包,增加...
Dialogue System for Unity 2.1.2(u2018.1.0)可以轻松地为您的游戏添加交互式对话和任务。 它是一个完整,强大的解决方案,包括基于可视节点的编辑器,对话UI,过场动画,任务日志,保存/加载等。 核心是一个精简,...
CMake是一款跨平台的开源构建系统,用于管理软件构建过程。它的主要目标是提供一个统一的、用户友好的界面,让开发者能够在不同的操作系统和编译器之间无缝切换。CMake不直接进行编译,而是生成特定平台的构建系统,...
### "format ' x' invalid or incompatible with argument" 解决办法 在进行电子设计自动化(EDA)软件Protel 99 SE的操作过程中,用户可能会遇到一个常见的错误提示:“format ' x' invalid or incompatible with ...