使用 protobuf-net 时,如何知道在现有对象上使用合并时将更新(或已经更新)哪些字段

When using protobuf-net, how do I know what fields will be updated (or have been updated) when using merge on an existing object

使用 Protobuf-net,我想知道在合并操作结束时更新了对象的哪些属性,以便我可以通知感兴趣的代码更新可能与这些更新的属性相关的其他组件。

我注意到有几种不同类型的 properties/methods 我可以添加,这将帮助我有选择地序列化(Specified 和 ShouldSerialize)。我在 MemberSpecifiedDecorator 中注意到,“read”方法在读取时会将指定的 属性 设置为 true。但是,即使我为每个字段添加指定的属性,我也必须检查每个(并在添加新属性时更新代码)

我目前的计划是创建一个自定义 SerializationContext.context 对象,然后在反序列化过程中检测到它 – 并更新成员列表。但是......代码中有很多地方我需要触摸才能做到这一点,如果可能的话我宁愿使用现有系统来做。

更希望得到更新的会员信息列表。我意识到,由于遍历对象图可能会产生许多成员,但在我的用例中,我没有合并复杂的对象,只是合并具有值类型属性的简单 POCO。

获取增量日志不是内置功能,部分原因是复杂模型的复杂性,正如您所指出的。 Specified 技巧会起作用,虽然这不是它的设计目的 - 但为了避免增加您自己的代码的复杂性,最好通过反射来处理,也许使用 Expression API为了表现。另一种方法可能是使用 ProtoReader 提前知道哪些字段 被触及,但这需要了解 field-number/member 映射(可以查询通过 RuntimeTypeModel).

您使用的是手工制作的模型吗?或者您正在使用 protogen?另一种选择是在 setter 中使用代码来记录某处的更改。我不认为 protogen 当前发出 partial 方法挂钩,但它可能 可以 .

但是让我反过来说:它不是现在内置的功能,而且由于复杂性 无论如何,它在某种程度上受到限制,但是:什么会"good"API你觉得这个怎么样?

附带说明:这并不是序列化程序中的常见功能 - 在我能想到的任何主流序列化程序中你都会遇到非常相似的挑战。