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 对象