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

Есть ли причина не объявлять все классы атрибутов protobuf-net ProtoContract с EnumPassthru=true

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

По сути, это приложение просто проксирует данные из базовой базы данных и в нее для наших клиентов, а также обрабатывает аутентификацию и кэширование.

Наши декорированные классы protobuf-net довольно просты, но некоторые из них также содержат типы enum.

Из-за обновлений версий, которые не всегда полностью развертываются на всех клиентах, мы иногда получаем

«Ни одно проводное значение не сопоставлено с перечислением xxx»

ошибка. Эта ошибка также возникает при наличии в базе данных целых чисел, приведенных к типу перечисления, что в чистом С# нормально, но вызовет исключение protobuf-net.

В тех случаях, когда это произошло, мы добавили опцию EnumPassthru через Protocontract(EnumPassthru = true).

Теперь я понимаю, что мы могли бы спроектировать объекты данных так, чтобы они были просто целыми/длинными числами вместо фактических типов перечисления, если они фактически не используются на стороне сервера, и привести их к правильной целочисленной стороне клиента.

Чтобы принять лучшее решение о том, что нам следует делать, я хотел бы знать, есть ли какая-либо причина не просто объявлять все классы, сериализованные protobuf, с параметром EnumPassthru=true, который также лучше отражает поведение C# по умолчанию.

Есть ли какие-либо предостережения при выполнении "replace all [ProtoContract()] ==> [Protocontract(EnumPassthru = true)]" ? Я попробовал это и не обнаружил никаких проблем при общении со старыми версиями, в которых этот параметр не включен.

10.08.2018

Ответы:


1

Нет, нет; Я бы на самом деле полностью одобрил это.

По сути, все сводится к тому, что Google меняет спецификацию. Первоначально было «правильным» для неожиданных значений перечисления вызывать отклонение ввода. Однако с некоторого момента времени "proto3" (последние несколько лет) они изменили свое решение и решили, что неожиданные значения перечисления следует принимать молча (по крайней мере, при использовании "proto3").

Так; последние версии protobuf-net (около года?) теперь по умолчанию используют подход «enum passthru». Старые версии protobuf-net: не делайте этого. Если по какой-либо причине у вас смешанные версии библиотек, размещение «enum passthru» везде является очень прагматичным и практичным решением.

Также обратите внимание, что перечисления [Flags] также всегда рассматривались как сквозные.

Существует также один сценарий, когда новые сборки protobuf-net не используют сквозной доступ по умолчанию; если у вас есть что-то вроде:

public enum Foo {
    A,
    [ProtoEnum(Value=42)]
    B,
    C,
}

он не может использовать сквозной доступ здесь, так как ему нужно вручную переназначить B (со значением 1) в вашем коде на 42 на проводе.

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

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

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

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

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

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

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

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