protobuf-net отсутствует функция has_ ​​для необязательных полей?

Мы используем буферы протокола для связи между собственными приложениями C++, а также между собственным приложением C++ и приложением.NET (все это VS2012) через protobuf-net r666. Мы сильно полагаемся на C++ на функции has_, которые доступны для необязательного элемента.

Например, если у нас есть сообщение с необязательным полем bool, может случиться так, что оно не установлено, установлено значение true или значение false.

В C++ это можно проверить с помощью функции has_field, и если установлено, то содержимое можно получить с помощью функции get_field. Если не установлено, и вызывается get_field, тогда get возвращает значение по умолчанию, которое, если явно не установлено, имеет значение false (для логического значения).

Это прекрасно работает в C++, но в protobuf-net, однако, мы не можем найти эквивалент функции has_, и, когда сообщение получено, поле добавляется к сообщению, а его содержимое устанавливается по умолчанию, быть ложным Это не катастрофа, что поле там по умолчанию, но проблема в том, что нет функции has_, чтобы проверить, была ли она установлена ​​в сообщении.

Пожалуйста, сообщите, является ли это ошибкой или мы что-то пропустили в protobuf-net и что это действительно возможно

Спасибо заранее. Wim

1 ответ

Решение

(Я знаю, что мы уже рассмотрели это в системе отслеживания проблем - это просто для наглядности и т. Д.)

Это относится к генерации классов из файлов.proto, что в случае с protobuf-net осуществляется с помощью инструмента protogen. По умолчанию он не создает эквивалент has_* методы, но это можно включить с помощью -p:detectMissing переключатель - что заставляет его создавать *Specified аксессоры. Именование здесь - это.NET идиома, с *Specified распознается некоторыми другими сериализаторами.NET и внутренним кодом. Это также генерирует частный ShouldSerialize* метод, который снова помогает некоторый внутренний код.NET.

В этом конкретном случае была вторичная проблема с участником под названием value вызывает путаницу; csharp.xslt Файл был обновлен, чтобы учесть это.


Обновление: в полностью управляемой перезаписи ShouldSerialize*() метод генерируется по умолчанию при использовании proto2 синтаксис (по умолчанию). Никаких дополнительных параметров не требуется. *Specified член не добавлен (он не служит никакой дополнительной цели в течение ShouldSerialize*(),

Обратите внимание, что при использовании proto3изменения в правилах сериализации означают, что эта концепция больше не имеет смысла. Значение сериализуется тогда и только тогда, когда оно не является значением по умолчанию, которое всегда равно null/false/zero/empty. Не существует понятия "значение по умолчанию, но указано". Из-за этого ShouldSerialize*() методы, как правило, больше не полезны и не генерируются. Я готов сделать их по желанию для proto3с ними в основном означает "не по умолчанию", если это помогает некоторому подлинному сценарию кодирования.

Другие вопросы по тегам