2013-02-12 12 views
5

C'è un modo per gestire un evento o richiamare un oggetto che è stato appena deserializzato da Protobuf senza dover esplicitamente chiamare il metodo dall'oggetto deserializzato?Protobuf .NET Post Deserialization Handler

Per esempio, dire che ho la seguente classe:

[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 
    } 
} 

Ci sarebbe un modo per chiamare in "ValidateAddresses" senza dover chiamare esplicitamente dalla oggetto deserializzato nel blocco di codice in cui è stato deserializzato ? Chiamarlo nel costruttore è inutile perché Protobuf non ha ancora applicato i valori serializzati, quindi sarebbe bello avere un modo per sapere quando ha finito di applicare i valori. Spero che ci sia un modo per raggiungere questo obiettivo al fine di eliminare la necessità di ridefinire la chiamata post-deserializzazione ovunque che l'oggetto viene utilizzato.

Ho alcune idee, ma ho pensato di postare la domanda prima di dirigermi verso il basso nel tentativo di provarle nel caso qualcuno avesse una migliore che non vedo ancora (il che è molto probabile). Grazie in anticipo.

risposta

14

Sì. Protobuf-net supporta i callback di serializzazione standard. Sia tramite gli attributi WCF/DataContractSerializer, sia con quelli specifici di protobuf-net. Nello specifico, si contrassegna un metodo con [OnDeserializedAttribute] o [ProtoAfterDeserialization] e verrà richiamato alla fine della deserializzazione. I metodi possono essere richiamati prima della serializzazione, dopo la serializzazione, prima della deserializzazione e dopo la deserializzazione.

WCF richiede una firma specifica per questi metodi, ma protobuf-net è meno pignolo: funzionerà con la firma WCF, ma consentirà anche i metodi senza parametri, o qualsiasi combinazione dei soliti parametri, o la serializzazione di protobuf-net contesto.

+0

Mi piacciono le soluzioni semplici e questo è MODO più diretto rispetto al percorso stravagante che ho seguito (classe di deserializzazione statica che riflette oggetto deserializzato e metodo di richiamo ecc., Non carina). Grazie Marc, questo è esattamente quello di cui avevo bisogno. – Ryan

Problemi correlati