ProtoBuf-NET 的 OnDeserialized 属性

use*_*797 2 protobuf-net

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

[OnDeserialized]
internal void OnDeserializedMethod(StreamingContext context)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

现在我们尝试使用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";
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 5

对我来说效果很好:

[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);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

OnDeserializedMethod
abc
Run Code Online (Sandbox Code Playgroud)

你可以说得更详细点吗?也许展示一个完整的示例来重现您所看到的内容?另外:你确定你使用的是 protobuf-net 吗?有些人对 protobuf-net 和 protobuf-csharp-port 感到非常困惑。我无法评论后者支持哪些功能。