Protobuf .NET 后反序列化处理程序

Posted

技术标签:

【中文标题】Protobuf .NET 后反序列化处理程序【英文标题】:Protobuf .NET Post Deserialization Handler 【发布时间】:2013-02-12 17:35:50 【问题描述】:

有没有办法处理事件或回调到刚刚被 Protobuf 反序列化的对象,而不必显式地从反序列化的对象中调用方法?

例如,假设我有以下课程:

[ProtoContract]
public class Customer

    [ProtoMember(1)]
    public string FirstName  get; set; 

    [ProtoMember(2)]
    public string MiddleName  get; set; 

    [ProtoMember(3)]
    public string LastName  get; set; 

    [ProtoMember(4)]
    public Dictionary<int, string> Addresses  get; set; 

    public Customer()
    
        //Subscibe to a Protobuf deserialization complete event?
    

    public void ValidateAddresses()
    
        //Some routine to validate addresses
    

是否有一种方法可以调用“ValidateAddresses”,而不必从反序列化代码块中的反序列化对象显式调用它?在构造函数中调用它是没有价值的,因为 Protobuf 还没有应用序列化的值,所以如果有办法知道它何时完成应用这些值会很好。我希望有一种方法可以实现这一点,以消除在使用对象的任何地方重构后反序列化调用的需要。

我有一些想法,但我想我会在开始验证它们之前发布问题,以防有人有更好的我还没有看到的想法(这很可能)。提前致谢。

【问题讨论】:

【参考方案1】:

是的。 Protobuf-net 支持标准的序列化回调。通过 WCF / DataContractSerializer 属性或 protobuf-net 特定的属性。具体来说,您可以使用[OnDeserializedAttribute][ProtoAfterDeserialization] 标记一个方法,它将在反序列化结束时调用。方法可以在序列化之前、序列化之后、反序列化之前和反序列化之后调用。

WCF 需要这些方法的特定签名,但 protobuf-net 不那么挑剔:它可以使用 WCF 签名,但也允许无参数方法,或任何常用参数的组合,或 protobuf-net 自己的序列化上下文.

【讨论】:

我喜欢简单的解决方案,这比我走的古怪路线更直接(静态反序列化类反映反序列化对象和调用方法等,不漂亮)。谢谢 Marc,这正是我所需要的。

以上是关于Protobuf .NET 后反序列化处理程序的主要内容,如果未能解决你的问题,请参考以下文章

protobuf.net 处理 Nullable<DateTimeOffset>

Protobuf.net “一旦生成了序列化程序,就无法更改类型”

NEventStore 3+ 的 Protobuf-net 序列化程序

为 protobuf-net 生成序列化程序集失败

Protobuf-net 序列化错误 =“一旦生成了序列化程序,就无法更改类型”

protobuf-net 中没有为 System.Version 定义序列化程序