2014-02-18 79 views
2

我們用JSON.NET我們的數據與OnDeserialized屬性一起序列化反序列化後,執行自定義代碼屬性:OnDeserialized用於protobuf網

[OnDeserialized] 
internal void OnDeserializedMethod(StreamingContext context) 
{ 
    ... 
} 

現在我們嘗試使用protobuf代替JSON.NET這種方法不執行。有沒有另外一種方法來實現這種行爲protobuf.net

這裏是行不通的例子:

class Program 
{ 
    static void Main(string[] args) 
    { 
     RuntimeTypeModel.Default.Add(typeof (Profile), false).Add(1000, "Id").Add(1001, "Text"); 

     var test = new Profile {Id = Guid.NewGuid(), Text = "123"}; 

     using (var memoryStream = new MemoryStream()) 
     { 
      Serializer.Serialize(memoryStream, test); 

      memoryStream.Seek(0, SeekOrigin.Begin); 

      var deserialized = Serializer.Deserialize<Profile>(memoryStream); 

      Console.WriteLine(deserialized.Text); // should output "changed" 
      Console.ReadLine(); 
     } 
    } 
} 

[ProtoContract] 
public class Profile 
{ 
    public Guid Id { get; set; } 
    public string Text { get; set; } 

    [OnDeserialized] 
    internal void OnDeserializedMethod(StreamingContext context) 
    { 
     Text = "changed"; 
    } 
} 

回答

3

正常工作對我來說:

[ProtoContract] 
public class Foo 
{ 
    [OnDeserialized] 
    internal void OnDeserializedMethod(StreamingContext context) 
    { 
     Console.WriteLine("OnDeserializedMethod"); 
    } 

    [ProtoMember(1)] 
    public string Bar { get;set; } 

    static void Main() 
    { 
     var foo = new Foo { Bar = "abc" }; 
     var clone = Serializer.DeepClone(foo); 
     Console.WriteLine(clone.Bar); 
    } 
} 

輸出:

OnDeserializedMethod 
abc 

你能更具體?也許顯示一個完整的例子,再現你所看到的?另外:你是當然你正在使用protobuf網?有些人在protobuf-net和protobuf-csharp-port之間感到非常困惑。我無法評論後者支持哪些功能。

+0

嗨,馬克!你的例子工作,但我的代碼仍然無法正常工作。我添加了一個示例控制檯應用程序來解釋我的問題。 – user1613797

+1

@user在示例中,您已禁用自動配置(false)。正因爲如此,自動配置沒有發生!如果您正在手動配置模型,包括告訴它要調用哪些回調函數。 MetaType上有一個方法。或者只是傳遞true而不是。 –

+0

謝謝Marc!我已將第二個參數更改爲true,現在可以使用。 – user1613797