2013-02-12 6 views
5

Gibt es eine Möglichkeit, ein Ereignis zu behandeln oder in ein Objekt zurückzurufen, das gerade von Protobuf deserialisiert wurde, ohne explizit die Methode vom deserialisierten Objekt aufrufen zu müssen?Protobuf .NET Post-Deserialisierungs-Handler

Zum Beispiel sagen, dass ich die folgende Klasse habe:

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

Würde eine Art und Weise zu nennen in „ValidateAddresses“ da sein, ohne es explizit aus dem entserialisierten Objekt in dem Codeblock anrufen zu müssen, wo es deserialisiert wurde ? Der Aufruf im Konstruktor ist wertlos, da Protobuf die serialisierten Werte noch nicht angewendet hat. Daher wäre es schön, wenn man wissen könnte, wann die Werte angewendet wurden. Ich hoffe, dass es einen Weg gibt, dies zu erreichen, um den Post-Deserialisierungs-Aufruf überall dort, wo das Objekt verwendet wird, zu reformieren.

Ich habe ein paar Ideen, aber ich dachte, ich würde die Frage posten, bevor ich den Weg des Beweises sie heraus für den Fall jemand hat eine bessere, die ich gerade noch nicht sehen (was sehr wahrscheinlich ist). Danke im Voraus.

Antwort

14

Ja. Protobuf-net unterstützt Standard-Serialisierungsrückrufe. Entweder über die WCF/DataContractSerializer-Attribute oder über die protobuf-net-spezifischen Attribute. Insbesondere können Sie eine Methode mit [OnDeserializedAttribute] oder [ProtoAfterDeserialization] markieren, die am Ende der Deserialisierung aufgerufen wird. Methoden können vor der Serialisierung, nach der Serialisierung, vor der Deserialisierung und nach der Deserialisierung aufgerufen werden.

WCF erfordert eine spezifische Signatur für diese Methoden, aber protobuf-net ist weniger aufwändig: Es wird mit der WCF-Signatur arbeiten, aber auch parameterlose Methoden oder eine beliebige Kombination der üblichen Parameter oder die eigene Serialisierung von protobuf-net erlauben Kontext.

+0

Ich liebe einfache Lösungen und das ist viel einfacher als die verrückte Route, die ich ging (statische Deserialisierung Klasse widerspiegelt deserialisierte Objekt und Aufrufmethode usw., nicht schön). Danke Marc, genau das habe ich gebraucht. – Ryan