2014-02-18 2 views
2

Мы использовали Json.NET сериализовать наши данные вместе с OnDeserialized атрибутом для выполнения пользовательского кода после десериализации:OnDeserialized атрибут для Protobuf-NET

[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 

Можете ли вы быть более конкретным? Возможно, показывая полный пример, который воспроизводит то, что вы видите? Также: are you sure Вы используете protobuf-net? Некоторые люди очень запутались между protobuf-net и protobuf-csharp-портом. Я не могу прокомментировать, какие функции поддерживает последний.

+0

Hi Marc! Ваш пример работает, но мой код все еще не работает. Я добавил пример консольного приложения на мой вопрос, чтобы продемонстрировать это. – user1613797

+1

@user в примере, вы отключили автоматическую настройку (ложь). Из-за этого автоматической конфигурации не произошло! Если вы вручную настроите модель, которая включает в себя рассказ о том, какие вызовы вызывать. Для этого есть метод для MetaType. Или просто передайте истину. –

+0

Спасибо, Марк! Я изменил второй параметр на true, и теперь он работает. – user1613797

Смежные вопросы