2013-02-12 74 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