ProtoBuf-NET 的 OnDeserialized 属性

Posted

技术标签:

【中文标题】ProtoBuf-NET 的 OnDeserialized 属性【英文标题】:OnDeserialized attribute for ProtoBuf-NET 【发布时间】:2014-02-18 13:23:30 【问题描述】:

我们使用 JSON.NET 将我们的数据与OnDeserialized 属性一起序列化,以在反序列化后执行自定义代码:

[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";
    

【问题讨论】:

【参考方案1】:

对我来说很好用:

[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-net吗?有些人对 protobuf-net 和 protobuf-csharp-port 感到非常困惑。我无法评论后者支持哪些功能。

【讨论】:

嗨,马克!您的示例有效,但我的代码仍然无法正常工作。我在我的问题中添加了一个示例控制台应用程序来演示这一点。 @user 在示例中,您已禁用自动配置(错误)。因此,没有发生自动配置!如果您手动配置模型,则包括告诉它要调用哪些回调。 MetaType 上有一个方法。或者只是传递 true。 谢谢马克!我已将第二个参数更改为 true,它现在可以工作了。

以上是关于ProtoBuf-NET 的 OnDeserialized 属性的主要内容,如果未能解决你的问题,请参考以下文章

Protobuf-net:嵌套的 IEnumerable 对象

用于继承的 Protobuf-net .proto 文件生成

带有 Protobuf-net 的端点行为配置 WCF

使用protobuf-net继承时如何选择字段号?

protobuf-net:如何注释派生类型的属性?

仅在 ProtoBuf-net 中序列化基类