c# - 序列化程序正在尝试序列化用 [ProtoIgnore] 装饰的属性

标签 c# .net serialization protobuf-net

我有以下类(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/

相关文章:

c# - 循环文件夹的文件并添加为附件

django-rest-framework - ForeignKey 不允许空值

javascript - MVC asp.net 中 Google Map Api 上的多个标记

c# - 未指定钱包文件(必须通过/wallet/<filename> uri-path 请求钱包 RPC)。在 C# 中使用 BitcoinLib 备份钱包时出错

c# - 在 WPF ListView 中以编程方式选择项目

c#取消定义所有参数的快速方法

.net - Look around 未通过 .net 提供预期结果

c# - 扩展方法与静态实用程序类

java - 为 JAXB 中生成的每个类生成唯一的可序列化 ID

c# - 如何使用 NewtonSoft Json.Net 将 Json 字典反序列化为平面类