2013-02-12 68 views
5

是否有办法处理事件或回调到Protobuf刚刚反序列化的对象中,而无需明确地从反序列化对象调用方法?Protobuf .NET Post反序列化处理程序

例如,说我有下面的类:

[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尚未应用序列化的值,因此有办法知道它何时完成应用值是很好的。我希望有一种方法可以实现这一点,以消除在使用对象的任何地方重构后反序列化调用的需要。

我有一些想法,但我想我会在找出证明他们的路径之前发布问题,以防万一有更好的,我还没有看到(这很可能)。提前致谢。

回答

14

是的。 Protobuf-net支持标准的序列化回调。通过WCF/DataContractSerializer属性或protobuf-net特定的属性。具体而言,您可以使用[OnDeserializedAttribute][ProtoAfterDeserialization]标记方法,并在反序列化结束时调用它。可以在序列化之前,序列化之后,反序列化之前和反序列化之后调用方法。 WCF需要这些方法的特定签名,但protobuf-net不那么挑剔:它可以与WCF签名一起工作,但也可以允许无参数方法或常用参数或protobuf-net自己的序列化的任意组合上下文。

+0

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