Protobuf .NET后序列化处理程序

8

有没有一种方法可以处理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个回答

19

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

WCF要求这些方法具有特定的签名,但protobuf-net不那么苛刻:它可以使用WCF签名,但也允许无参数方法,或任何组合的常规参数或protobuf-net自身的序列化上下文。


1
我喜欢简单的解决方案,这比我之前采用的古怪方法(如静态反序列化类、反射反序列化对象并调用方法等)要直接得多。感谢Marc,这正是我所需要的。 - Ryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接