2013-02-12 2 views
5

Есть ли способ обработать событие или перезвонить в объект, который только что был десериализирован Protobuf, без необходимости явно вызывать метод из десериализованного объекта?Protobuf .NET Post Deserialization Handler

Например, у меня есть следующий класс:

[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, либо конкретные протобуф-сети. В частности, вы отмечаете метод с [OnDeserializedAttribute] или [ProtoAfterDeserialization], и он будет вызываться в конце десериализации. Методы можно вызывать перед сериализацией, после сериализации, перед десериализацией и после десериализации.

Для WCF требуется определенная подпись для этих методов, но protobuf-net менее суетливая: она будет работать с сигнатурой WCF, но также позволит использовать безпараметрические методы или любую комбинацию обычных параметров или собственную сериализацию protobuf-net контекст.

+0

Я люблю простые решения, и это ПУТЬ более прямолинейно, чем пугающий маршрут, который я отправил (статический класс десериализации, отражающий десериализованный объект, метод вызова и т. Д., Не очень). Спасибо, Марк, это именно то, что мне нужно. – Ryan