У меня есть вопрос / проблема.
Я отправляю сообщения из C ++ в Java (Play framework), используя RabbitMq. Итак, на стороне C ++ я использовал функцию SerializeToString
(также пробовал SerializeToArray
с char*
). ParseFrom не работает в Java, используя String
или byte []
.
Подробно: в моем сообщении я отправляю изображения base64, более 500 тыс. Символов как String
. Ошибка:
CodedInputStream encountered an embedded string or message which claimed to have negative size
Сообщения без строк 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)
3 ответа
Попробуйте кодировать base64 на стороне C ++ и декодировать на стороне Java, прежде чем ParseFrom
.
Подробнее здесь
Попробуйте протестировать код с изображениями меньшего размера, например, 50 тыс. Символов, и посмотрите, работает ли он. Если размер изображения превышает 1 миллион символов, то есть более 2 миллионов байтов, это может вызвать проблемы, поскольку CodedInputStream $ ArrayDecoder.pushLimit получает первый байт как общее количество байтов, а int имеет ограничение положительного значения 2147483647 до переполнения, это переполнение может устанавливать размер отрицательное исключение.
Я решил ошибку.
Первым делом я использовал уменьшенное изображение, как сказал @ leonardo-go, но я получил ошибку:
[InvalidProtocolBufferException: While parsing a protocol message, the input ended unexpectedly in the middle of a field. This could mean either that the input has been truncated or that an embedded message misreported its own length.]
После того, как я попробовал кодирование и декодирование, как сказал @ joão-pedro-bernardino, все заработало.
Похожие вопросы
Связанные вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].