我们使用 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)
对我来说效果很好:
[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 感到非常困惑。我无法评论后者支持哪些功能。
| 归档时间: |
|
| 查看次数: |
1166 次 |
| 最近记录: |