序列化程序正在尝试序列化用[ProtoIgnore]修饰的属性

本文关键字:序列化 属性 ProtoIgnore 程序 | 更新日期: 2023-09-27 18:28:28

我有以下类

[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时遇到了一个异常。即使使用ProtoIgnore属性修饰属性,它也会显示No serializer defined for type: SomeNamespace.Bar

注意:如果我删除ImplicitFields并使用ProtoMember,则序列化有效。

我做错什么了吗?

序列化程序正在尝试序列化用[ProtoIgnore]修饰的属性

您已经告诉它序列化字段。该字段未使用[ProtoIgnore]进行修饰。属性是,并且没有将字段等同于属性的好方法。这里使用"字段"一词是非常具体和有意的:它的意思不是"成员",而是"字段"。

选项:

  • 告诉它序列化公共成员,而不是字段
  • 使用手动实现的属性,并用[ProtoIgnore]标记字段
  • 手动标记成员

如果自动实现的属性允许与类似字段的事件(即)相同的语法,那将是很好的

[field:ProtoIgnore]
public int Foo {get;set;}

然而,我确信这在语言中是不受支持的。