我有以下类(class)
[ProtoContract(ImplicitFields = ImplicitFields.AllFields)]
public class Foo
{
public int foo { get; set; }
[ProtoIgnore]
public Bar bar { get; set; }
public int ToMD5Hash()
{
var md5 = MD5CryptoServiceProvider.Create();
using (MemoryStream ms = new MemoryStream())
{
Serializer.Serialize<Foo>(ms, this);
var hash = md5.ComputeHash(ms.ToArray());
return BitConverter.ToInt32(hash, 0);
}
}
}
但是我在调用 ToMD5Hash 时遇到异常。它说 No serializer defined for type: SomeNamespace.Bar
即使该属性是用 ProtoIgnore 属性修饰的。
注意:如果我删除 ImplicitFields 并使用 ProtoMember,则序列化有效。
我做错了什么吗?
最佳答案
您已经告诉它序列化字段。该字段未使用 [ProtoIgnore]
修饰。 属性 是,没有什么好的方法可以将字段等同于属性。此处使用术语“字段”是非常具体和有意的:它不是指“成员”,而是指“字段”。
选项:
- 告诉它序列化公共(public)成员,而不是字段
- 使用手动实现的属性并使用
[ProtoIgnore]
标记字段
- 手动标记成员
如果自动实现的属性允许使用与类似字段的事件相同的语法,那就很好,即
[field:ProtoIgnore]
public int Foo {get;set;}
但是,我很确定该语言不支持它。
关于c# - 序列化程序正在尝试序列化用 [ProtoIgnore] 装饰的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26632614/