java - 在 C++ 的 Java 中失败 ParseFrom 消息

标签 java c++ rabbitmq base64 protocol-buffers

我有一个问题。

我正在使用 RabbitMq 将消息从 C++ 发送到 Java(Play 框架)。因此,在 C++ 方面,我使用了 SerializeToString 函数(也尝试了 SerializeToArraychar* )。 ParseFrom 在使用 Stringbyte [] 的 Java 中不起作用。

详细信息:在我的消息中,我发送了 base64 图像,超过 500k 个字符作为 String。错误是:

CodedInputStream 遇到了声称具有负大小的嵌入字符串或消息

没有 base64 字符串和其他属性的消息,ParseFrom 可以正常工作。

这里是完整的错误:

play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[InvalidProtocolBufferException: CodedInputStream encountered an embedded string or message which claimed to have negative size.]]
    at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:323)
    at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:243)
    at play.core.server.AkkaHttpServer$$anonfun$1.applyOrElse(AkkaHttpServer.scala:382)
    at play.core.server.AkkaHttpServer$$anonfun$1.applyOrElse(AkkaHttpServer.scala:380)
    at scala.concurrent.Future.$anonfun$recoverWith$1(Future.scala:417)
    at scala.concurrent.impl.Promise.$anonfun$transformWith$1(Promise.scala:41)
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:64)
    at akka.dispatch.BatchingExecutor$AbstractBatch.processBatch(BatchingExecutor.scala:55)
    at akka.dispatch.BatchingExecutor$BlockableBatch.$anonfun$run$1(BatchingExecutor.scala:91)
    at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
Caused by: com.google.protobuf.InvalidProtocolBufferException: CodedInputStream encountered an embedded string or message which claimed to have negative size.
    at com.google.protobuf.InvalidProtocolBufferException.negativeSize(InvalidProtocolBufferException.java:92)
    at com.google.protobuf.CodedInputStream$ArrayDecoder.pushLimit(CodedInputStream.java:1179)
    at com.google.protobuf.CodedInputStream$ArrayDecoder.readMessage(CodedInputStream.java:881)
    at model.RequestOrResponse$Response.dynamicMethod(RequestOrResponse.java:1542)
    at com.google.protobuf.GeneratedMessageLite.parsePartialFrom(GeneratedMessageLite.java:1597)
    at com.google.protobuf.GeneratedMessageLite.parsePartialFrom(GeneratedMessageLite.java:1630)
    at com.google.protobuf.GeneratedMessageLite.parseFrom(GeneratedMessageLite.java:1746)
    at model.RequestOrResponse$Response.parseFrom(RequestOrResponse.java:1232)
    at controllers.SubjectController.get(SubjectController.java:195)
    at router.Routes$$anonfun$routes$1.$anonfun$applyOrElse$14(Routes.scala:187)

最佳答案

ParseFrom 之前尝试在 C++ 端编码 base64 并在 Java 端解码。
阅读更多 here

关于java - 在 C++ 的 Java 中失败 ParseFrom 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55954550/

相关文章:

c++ - 如何使用 ncurses 库在 c++ for mac 中打印特殊字符

java - 超出最大许可数

java - 如何使用 Radaee Pdf 阅读器 sdk

java - 如何停止该线程内的线程/计时器?

c++ - 不在 main() 线程中创建 QCoreApplication 对象是否合法?

python - struct.error : unpack requires a buffer of 288 bytes when unpacking c++ structure

erlang - 分布式 RabbitMQ 节点无法相互识别

rabbitmq - RabbitMQ 中心跳的合理值是多少?

java - 从 GitHub 获取 OAuth 访问 token 时出现 Cookie 错误

java - 如何使用 MongoClient 类从 Mongo java 驱动程序调用 db.Collection.stats()