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

时间:2014-10-29 14:14:26

标签: c# .net serialization protobuf-net

我有以下课程

[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,序列化将起作用。

我做错了吗?

1 个答案:

答案 0 :(得分:6)

您已告诉它序列化字段。该字段未使用[ProtoIgnore]进行修饰。 属性是,并没有好的方法将字段等同于属性。使用术语&#34;字段&#34;这是非常具体和有意的:它并不意味着&#34;成员&#34; - 它意味着&#34;字段&#34;。

选项:

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

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

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

但是,我非常确定该语言不支持此功能。