Nano Hash - криптовалюты, майнинг, программирование

обязательное поле protobuf и значение по умолчанию

Я новичок в protobuf, и я начал рассматривать следующий тривиальный пример

message Entry {
  required int32 id = 1;
}

используется кодом С++

#include <iostream>
#include "example.pb.h"
int main() {
  std::string mySerialized;
  {
    Entry myEntry;
    std::cout << "Serialization succesfull " 
              << myEntry.SerializeToString(&mySerialized) << std::endl;
    std::cout << mySerialized.size() << std::endl;
  }
  Entry myEntry;
  std::cout << "Deserialization successfull "
            << myEntry.ParseFromString(mySerialized) << std::endl;
}

Даже если поле «id» является обязательным, поскольку оно не задано, размер буфера сериализации равен 0 (??).

Когда я десериализую сообщение, возникает ошибка:

[libprotobuf ERROR google/protobuf/message_lite.cc:123] Can't parse message of type "Entry" because it is missing required fields: id

Это нормальное поведение?

Франческо

ps- Если я инициализирую "id" значением 0, поведение будет другим

pps — функция SerializeToString возвращает true, ParseFromString возвращает false

12.03.2013

  • Разве эти методы не имеют возвращаемых значений, которые говорят вам, сработало это или нет? ты их проверяешь? 12.03.2013
  • обратите внимание, что буфер нулевой длины вполне допустим в protobuf - это то, что вы получаете, если нет полей для сериализации 12.03.2013

Ответы:


1

Не думаю, что я точно понимаю ваш вопрос, но я все равно попробую ответить. Надеюсь, это поможет вам так или иначе :)

Да это нормальное поведение. Добавлять required следует только в том случае, если поле важно для сообщения. Это имеет смысл семантически. (зачем пропускать обязательное поле). Чтобы обеспечить это, protobuf не будет анализировать сообщение.

Он видит, что поле, отмеченное номером 1, является обязательным, а метод has_id() возвращает false. Таким образом, он вообще не будет анализировать сообщение.

В руководстве для разработчиков рекомендуется не использовать обязательные поля.

Обязательно всегда Вы должны быть очень осторожны, помечая поля как обязательные. Если в какой-то момент вы захотите перестать записывать или отправлять обязательное поле, изменить это поле на необязательное будет проблематично — старые читатели сочтут сообщения без этого поля неполными и могут непреднамеренно отклонить или удалить их. Вместо этого вам следует подумать о написании специальных процедур проверки для ваших буферов. Некоторые инженеры Google пришли к выводу, что использование required приносит больше вреда, чем пользы; они предпочитают использовать только необязательные и повторяющиеся. Однако это мнение не является универсальным.

Также

Любые новые поля, которые вы добавляете, должны быть необязательными или повторяться. Это означает, что любые сообщения, сериализованные с помощью кода, использующего ваш «старый» формат сообщения, могут быть проанализированы вашим новым сгенерированным кодом, поскольку в них не будут отсутствовать какие-либо необходимые элементы. Вы должны установить разумные значения по умолчанию для этих элементов, чтобы новый код мог правильно взаимодействовать с сообщениями, созданными старым кодом. Точно так же сообщения, созданные вашим новым кодом, могут быть проанализированы вашим старым кодом: старые двоичные файлы просто игнорируют новое поле при разборе. Однако неизвестные поля не отбрасываются, и если сообщение сериализуется позже, неизвестные поля сериализуются вместе с ним, поэтому, если сообщение передается новому коду, новые поля по-прежнему доступны. Обратите внимание, что сохранение неизвестных полей в настоящее время недоступно для Python.

12.03.2013
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..