2013-11-08 3 views
0

I ParseFromArray протокол протокола протокола, протокол не испытывает недостатка в поданной. Но функция ParseFromArray возвращает false. Зачем?, когда ParseFromArray возвращает true в протокольном буфере

+0

Возможно, вы захотите добавить тег языка (например, Java, C# и т. Д.), Поскольку существуют разные версии буферов протокола для разных языков. Также на некоторых языках имеется несколько разных версий протокольных буферов. –

ответ

3

Я предполагаю, что вы используете C++. ParseFromArray() не удается:

  • Ввод данных не соответствует действующему формату protobuf.
  • В входных данных отсутствует требуемое поле.

Если вы уверены, что все обязательные поля установлены, то это должно быть так, что ваши входные данные повреждены. Вы должны убедиться, что байты и размер, которые вы передаете в ParseFromArray(), равны точно байтов и размерах, которые вы получили от SerializeToArray() и ByteSize() со стороны отправки. Вероятно, вы обнаружите, что где-то теряете некоторые байты или что некоторые байты повреждены.

Общие причины коррупции:

  • Передача кодированных байтов через текстовый только канал. Например. если вы записываете данные (или читаете их) из файла, который не открывается в «двоичном» режиме, или если вы в какой-то момент храните байты в Java String, данные будут повреждены, так как эти каналы ожидают текст, и закодированные протобуфы не являются текстом.
  • Передача байтов как char*, то есть при допущении NUL-терминации. Закодированные протобуфы могут содержать '\0' байтов, что означает, что вы не можете представлять их как char* - вы должны включать размер отдельно.
  • Сериализация массива, который больше, чем необходимо, и затем забыть обратить внимание на то, сколько данных было написано. Когда вы вызываете SerializeToArray(), вы также должны позвонить ByteSize(), чтобы узнать, насколько велико сообщение, и вы должны убедиться, что принимающая сторона получает этот размер и передает его на ParseFromArray(). В противном случае анализатор будет считать, что дополнительные байты в конце буфера являются частью сообщения и не смогут их проанализировать.
+0

Особый случай, когда входные данные не имеют требуемого поля, когда ** разбор требуемого поля перечисления с неправильным значением **. Согласно [doc] (https://developers.google.com/protocol-buffers/docs/reference/cpp-generated#enum), если недопустимое значение перечисления считывается при разборе сообщения, оно будет рассматриваться как неизвестное поле. В свою очередь, недопустимое значение перечисления может быть передано через провод, если отправитель имеет другую версию определения перечисления в его прото-файле, например, перечисление отправителя имеет несколько дополнительных значений по сравнению с получателем. –

Смежные вопросы