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
с ними в основном означает "не по умолчанию", если это помогает некоторому подлинному сценарию кодирования.