Я использую Protobuf Теперь в течение нескольких недель, но я до сих пор продолжаю получать исключения при разборе Protobuf сообщений в Java.Исключение при чтении Protobuf сообщений в Java
Я использую C++ создавать свои Protobuf сообщение и отправлять их с наддувом гнезд к сокету сервера, где Java-клиент IST прослушивания. C++ код для передачи сообщения заключается в следующем:
boost::asio::streambuf b;
std::ostream os(&b);
ZeroCopyOutputStream *raw_output = new OstreamOutputStream(&os);
CodedOutputStream *coded_output = new CodedOutputStream(raw_output);
coded_output->WriteVarint32(agentMessage.ByteSize());
agentMessage.SerializeToCodedStream(coded_output);
delete coded_output;
delete raw_output;
boost::system::error_code ignored_error;
boost::asio::async_write(socket, b.data(), boost::bind(
&MessageService::handle_write, this,
boost::asio::placeholders::error));
Как вы можете видеть, что я пишу с WriteVarint32
длину сообщения, таким образом, на стороне Java должен знать, используя parseDelimitedFrom
насколько это следует читать:
AgentMessage agentMessage = AgentMessageProtos.AgentMessage
.parseDelimitedFrom(socket.getInputStream());
Но это не поможет, я получаю такого рода исключений:
Protocol message contained an invalid tag (zero).
Message missing required fields: ...
Protocol message tag had invalid wire type.
Protocol message end-group tag did not match expected tag.
While parsing a protocol message, the input ended unexpectedly in the middle of a field. This could mean either than the input has been truncated or that an embedded message misreported its own length.
это важно знать, что эти исключения не бросаются на каждое сообщение. Это всего лишь часть сообщений, которые я получаю, большинство из них очень хорошо работает - все равно я хотел бы исправить это, так как я не хочу пропускать сообщения.
Я был бы очень благодарен, если бы кто-то помог мне или потратил его идеи.
Еще один интересный факт - количество сообщений, которые я получаю. Обычно для моей программы обычно составляет 1.000 за 2 секунды. Через 20 секунд около 100.000 и так далее. Я уменьшил сообщения, отправленные искусственно, и когда передано только 6-8 сообщений, ошибок вообще нет. Так может ли это быть проблемой буферизации на стороне сокета клиента Java?
Включите, скажем, 60 000 сообщений, из которых 5 из них повреждены в среднем.
Может быть, глупый вопрос, но есть ли способ, которым вы оставили отступы/негабаритные буферы в данных, а не обрезание излишков? –
(эта ошибка, безусловно, может быть легко вызвана запасными нулями) –
@ Marc-Gravell: Что было бы негабаритных буферов? На самом деле, я не понимаю, что вы думаете, может вызвать это. Может быть, вы могли бы указать, где я должен искать это? Btw. Я добавил несколько других исключений, которые я получаю. –