При использовании protobuf-Net, как я знаю, какие поля будут обновлены (или были обновлены) при использовании слияния на существующий объект - PullRequest
0 голосов
/ 30 января 2019

Используя Protobuf-net, я хочу знать, какие свойства объекта были обновлены в конце операции слияния, чтобы я мог уведомить заинтересованный код об обновлении других компонентов, которые могут относиться к этим обновленным свойствам.

Я заметил, что есть несколько различных типов свойств / методов, которые я могу добавить, что поможет мне выборочно сериализоваться (Specified и ShouldSerialize).Я заметил в MemberSpecifiedDecorator, что метод read установит для указанного свойства значение true при чтении.Однако даже если я добавлю указанные свойства для каждого поля, мне придется проверять каждое из них (и обновлять код при добавлении новых свойств)

Мой текущий план заключается в создании пользовательского объекта SerializationContext.context изатем обнаружите это во время процесса деаэрализации и обновите список участников.Однако… в коде есть несколько мест, к которым мне нужно прикоснуться, и я бы предпочел сделать это, используя существующую систему, если это возможно.

Намного более желательно получить список обновленныхИнформация об участнике.Я понимаю, что из-за перехода по графу объектов, который может привести ко многим элементам, но в моем случае использования я не объединяю сложные объекты, а просто простые POCO со свойствами типа значения.

1 Ответ

0 голосов
/ 30 января 2019

Получение дельта-журнала не является встроенной функцией, отчасти из-за сложности, когда речь идет о сложных моделях, как вы заметили.Трюк Specified сработает, хотя это и не та цель, для которой он был разработан - но чтобы избежать усложнения вашего собственного кода, это было бы лучше всего решать с помощью рефлексии, возможно, используя Expression API для производительности.Другой подход может заключаться в использовании ProtoReader, чтобы заранее знать, какие поля будут затронуты, но это требует понимания номера поля / карты элемента (которую можно запросить с помощью RuntimeTypeModel).

Используете ли вы модели habd?Или вы используете protogen?Еще одним вариантом было бы иметь код в установщиках, которые регистрируют изменения где-то.Я не думаю, что protogen в настоящее время испускает partial методы хуков, но возможно может .

Но позвольте мне перевернуть это: это не встроенная функцияпрямо сейчас, и это несколько ограничено из-за сложности в любом случае , но: как бы выглядел «хороший» API для этого?

Как примечание: это не такна самом деле обычные функции в сериализаторах - у вас будут очень похожие проблемы в любом распространенном сериализаторе, о котором я только могу подумать.

...