в настоящее время у нас есть клиент-серверное приложение, которое использует ряд сериализованных классов protobuf-net для удобной передачи объектов данных.
По сути, это приложение просто проксирует данные из базовой базы данных и в нее для наших клиентов, а также обрабатывает аутентификацию и кэширование.
Наши декорированные классы protobuf-net довольно просты, но некоторые из них также содержат типы enum.
Из-за обновлений версий, которые не всегда полностью развертываются на всех клиентах, мы иногда получаем
«Ни одно проводное значение не сопоставлено с перечислением xxx»
ошибка. Эта ошибка также возникает при наличии в базе данных целых чисел, приведенных к типу перечисления, что в чистом С# нормально, но вызовет исключение protobuf-net.
В тех случаях, когда это произошло, мы добавили опцию EnumPassthru через Protocontract(EnumPassthru = true)
.
Теперь я понимаю, что мы могли бы спроектировать объекты данных так, чтобы они были просто целыми/длинными числами вместо фактических типов перечисления, если они фактически не используются на стороне сервера, и привести их к правильной целочисленной стороне клиента.
Чтобы принять лучшее решение о том, что нам следует делать, я хотел бы знать, есть ли какая-либо причина не просто объявлять все классы, сериализованные protobuf, с параметром EnumPassthru=true
, который также лучше отражает поведение C# по умолчанию.
Есть ли какие-либо предостережения при выполнении "replace all [ProtoContract()] ==> [Protocontract(EnumPassthru = true)]"
? Я попробовал это и не обнаружил никаких проблем при общении со старыми версиями, в которых этот параметр не включен.