I ParseFromArray протокол протокола протокола, протокол не испытывает недостатка в поданной. Но функция ParseFromArray возвращает false
. Зачем?, когда ParseFromArray возвращает true в протокольном буфере
ответ
Я предполагаю, что вы используете C++. ParseFromArray()
не удается:
- Ввод данных не соответствует действующему формату protobuf.
- В входных данных отсутствует требуемое поле.
Если вы уверены, что все обязательные поля установлены, то это должно быть так, что ваши входные данные повреждены. Вы должны убедиться, что байты и размер, которые вы передаете в ParseFromArray()
, равны точно байтов и размерах, которые вы получили от SerializeToArray()
и ByteSize()
со стороны отправки. Вероятно, вы обнаружите, что где-то теряете некоторые байты или что некоторые байты повреждены.
Общие причины коррупции:
- Передача кодированных байтов через текстовый только канал. Например. если вы записываете данные (или читаете их) из файла, который не открывается в «двоичном» режиме, или если вы в какой-то момент храните байты в Java
String
, данные будут повреждены, так как эти каналы ожидают текст, и закодированные протобуфы не являются текстом. - Передача байтов как
char*
, то есть при допущении NUL-терминации. Закодированные протобуфы могут содержать'\0'
байтов, что означает, что вы не можете представлять их какchar*
- вы должны включать размер отдельно. - Сериализация массива, который больше, чем необходимо, и затем забыть обратить внимание на то, сколько данных было написано. Когда вы вызываете
SerializeToArray()
, вы также должны позвонитьByteSize()
, чтобы узнать, насколько велико сообщение, и вы должны убедиться, что принимающая сторона получает этот размер и передает его наParseFromArray()
. В противном случае анализатор будет считать, что дополнительные байты в конце буфера являются частью сообщения и не смогут их проанализировать.
Особый случай, когда входные данные не имеют требуемого поля, когда ** разбор требуемого поля перечисления с неправильным значением **. Согласно [doc] (https://developers.google.com/protocol-buffers/docs/reference/cpp-generated#enum), если недопустимое значение перечисления считывается при разборе сообщения, оно будет рассматриваться как неизвестное поле. В свою очередь, недопустимое значение перечисления может быть передано через провод, если отправитель имеет другую версию определения перечисления в его прото-файле, например, перечисление отправителя имеет несколько дополнительных значений по сравнению с получателем. –
- 1. Java HashMap в протокольном буфере
- 2. Как определить, когда сообщение о протокольном буфере получено полностью?
- 3. Когда HttpUrlConnection.usingProxy() возвращает true?
- 4. Когда is is.vector() возвращает true?
- 5. Почему isItemChecked() возвращает true, когда в ActionMode?
- 6. ! IsPostBack возвращает true true
- 7. Почему (если false возвращает «true») ... возвращает true?
- 8. , когда символы хранятся в буфере
- 9. in_array возвращает false, когда должен возвращать true
- 10. Почему mysql возвращает true, когда false
- 11. Код JQuery возвращает true, когда не предполагается
- 12. File.Exists возвращает True, когда должен быть False
- 13. String.compare возвращает true, когда строки не равны?
- 14. in_array возвращает true, когда элемент не существует
- 15. Возвращает true, когда запрос дает 1
- 16. SelectionKey.isAcceptable() Возвращает «true» Когда нет входящих подключений
- 17. List.Contains не возвращает true, когда существует элемент
- 18. find функция возвращает true, когда false
- 19. Обработка случаев, когда сбой session_start() возвращает true
- 20. Почему Request.IsSecureConnection возвращает false, когда true ожидается
- 21. strtok() then strcmp() возвращает false, когда true
- 22. StringUtils isNumeric возвращает true, когда вход «???», почему?
- 23. Функция vb возвращает true, когда false
- 24. sql server functions возвращает true, когда maxdate
- 25. Javascript! == возвращает true, когда должен возвращать false
- 26. connectivitymanager.getActiveNetworkInfo() возвращает true, когда Интернет выключен (Android)?
- 27. Почему (: скрыто) возвращает true, когда видимо?
- 28. Почему (true && 1) возвращает 1, но (1 && true) возвращает true?
- 29. Когда Rspec true! = True?
- 30. Почему obj.prop возвращает true, когда obj.hasOwnProperty ('prop') возвращает false?
Возможно, вы захотите добавить тег языка (например, Java, C# и т. Д.), Поскольку существуют разные версии буферов протокола для разных языков. Также на некоторых языках имеется несколько разных версий протокольных буферов. –