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

C# 使用protobuf net时,如何知道在现有对象上使用合并时哪些字段将被更新(或已被更新),c#,protobuf-net,C#,Protobuf Net,使用Protobuf net,我想知道在合并操作结束时更新了对象的哪些属性,以便通知感兴趣的代码更新可能与这些更新的属性相关的其他组件 我注意到我可以添加一些不同类型的属性/方法,它们将帮助我有选择地序列化(指定和应序列化)。我注意到在MemberSpecifiedCorator中,“read”方法在读取时会将指定的属性设置为true。然而,即使我为每个字段添加了指定的属性,我也必须检查每个字段(并在添加新属性时更新代码) 我当前的计划是创建一个自定义的SerializationContext.

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

我注意到我可以添加一些不同类型的属性/方法,它们将帮助我有选择地序列化(指定和应序列化)。我注意到在MemberSpecifiedCorator中,“read”方法在读取时会将指定的属性设置为true。然而,即使我为每个字段添加了指定的属性,我也必须检查每个字段(并在添加新属性时更新代码)

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


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

获取增量日志并不是一个内置功能,部分原因在于复杂模型的复杂性,正如您所注意到的。指定的
技巧将起作用,尽管这不是它设计的目的-但为了避免给您自己的代码增加复杂性,最好通过反射来处理,也许使用
表达式
API来提高性能。另一种方法可能是使用
ProtoReader
提前知道哪些字段将被触及,但这需要了解字段编号/成员映射(可以通过
RuntimeTypeModel
查询)

您是否使用habd特制的模型?或者您正在使用protogen
?另一种选择是在setter中添加代码,将更改记录在某处。我不认为
protogen
目前发出
partial
方法挂钩,但它可能会

但让我来扭转这个局面:它不是现在内置的功能,而且由于复杂性,它有点有限,但是:对于您来说,一个“好”的API会是什么样的呢


顺便说一句:这并不是序列化程序中的常见功能—在我所能想到的任何主流序列化程序中,您都会遇到类似的挑战。

最终,合并结束时更新的属性列表。反序列化后属性似乎是放置此类函数的好地方。我注意到回调已经在做一些工作,以确定该方法具有什么类型的参数,然后在调用该方法的过程中填充这些参数(非常棒)。在那里为某种“记帐”类型的对象再添加一个属性将非常有用。但是,更好的方法是在反序列化结束时回调相同的函数,该函数可以应用于RuntimeTypeModel。向RuntimeTypeModel添加回调似乎是更好的方法,因为这样我就不必为我的POCO增加复杂性,而我目前是手工创建的。