Моя проблема состоит в том, чтобы сериализовать данные protobuf в C ++ и десериализовать данные в Java, вероятно.
Вот код, который я использую для подсказок, данных dcn:
С этим я создаю данные protobuf в C ++ и записываю их в ostream, который отправляется через сокет.
Name name;
name.set_name("platzhirsch");
boost::asio::streambuf b;
std::ostream os(&b);
ZeroCopyOutputStream *raw_output = new OstreamOutputStream(&os);
CodedOutputStream *coded_output = new CodedOutputStream(raw_output);
coded_output->WriteLittleEndian32(name.ByteSize());
name.SerializeToCodedStream(coded_output);
socket.send(b);
Это сторона Java, где я пытаюсь ее проанализировать:
NameProtos.Name name = NameProtos.Name.parseDelimitedFrom(socket.getInputStream());
System.out.println(name.newBuilder().build().toString());
Однако этим я получаю это исключение:
com.google.protobuf.UninitializedMessageException: в сообщении отсутствуют обязательные поля: имя
Чего мне не хватает?
Неправильная строка кода: name.newBuilder().build().toString()
Это никогда бы не сработало, создается новый экземпляр с неинициализированным полем имени. В любом случае ответ здесь решил остальную часть моей проблемы.
И последнее, что мне сказали в списке рассылки protobuf: чтобы очистить CodedOutputStreams, объекты должны быть удалены!
delete coded_output;
delete raw_output;