【问题标题】:OnDeserialized attribute for ProtoBuf-NETProtoBuf-NET 的 OnDeserialized 属性
【发布时间】: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";
    }
}

【问题讨论】:

    标签: protobuf-net


    【解决方案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,它现在可以工作了。
    猜你喜欢
    • 1970-01-01
    • 2013-06-16
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    相关资源
    最近更新 更多