2013-02-12 32 views
5

Có cách nào để xử lý một sự kiện hoặc gọi lại vào một đối tượng vừa được deserialized bởi Protobuf mà không cần phải thực sự gọi phương thức từ đối tượng deserialized?Protobuf .NET Post Deserialization Handler

Ví dụ, nói rằng tôi có lớp sau:

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

Nên có một cách để gọi vào "ValidateAddresses" mà không cần phải gọi nó một cách rõ ràng từ đối tượng deserialized trong khối mã nơi nó được deserialized ? Gọi nó trong constructor là vô giá trị bởi vì Protobuf đã không áp dụng các giá trị serialized, vì vậy nó sẽ được tốt đẹp để có một cách để biết khi nó đã hoàn thành áp dụng các giá trị. Tôi hy vọng có một cách để thực hiện điều này để loại bỏ sự cần thiết phải cấu trúc lại cuộc gọi deserialization bài ở khắp mọi nơi mà đối tượng đang được sử dụng.

Tôi có một số ý tưởng nhưng tôi nghĩ rằng tôi sẽ đăng câu hỏi trước khi tôi đi xuống đường dẫn chứng minh chúng trong trường hợp ai đó có cái tốt hơn mà tôi chưa thấy (rất có thể). Cảm ơn trước.

Trả lời

14

Có. Protobuf-net hỗ trợ các callback serialization chuẩn. Hoặc thông qua các thuộc tính WCF/DataContractSerializer, hoặc các protobuf-net cụ thể. Cụ thể, bạn ca đánh dấu phương thức với [OnDeserializedAttribute] hoặc [ProtoAfterDeserialization] và phương thức này sẽ được gọi vào cuối quá trình deserialization. Các phương thức có thể được gọi trước khi tuần tự hóa, sau khi tuần tự hóa, trước khi deserialization và sau khi deserialization.

WCF yêu cầu chữ ký cụ thể cho các phương pháp này, nhưng protobuf-net ít gây khó chịu: nó sẽ hoạt động với chữ ký WCF, nhưng cũng sẽ cho phép các phương thức không tham số hoặc bất kỳ kết hợp nào của các tham số thông thường hoặc tuần tự riêng của protobuf-net bối cảnh.

+0

Tôi thích các giải pháp đơn giản và đây là cách đi thẳng hơn con đường lập dị mà tôi đã đi (lớp deserialization tĩnh phản ánh đối tượng deserialized và gọi phương thức, v.v., không đẹp). Cảm ơn Marc, đây chính xác là những gì tôi cần. – Ryan

Các vấn đề liên quan