为什么 Protobuf-net 类型模型不序列化私有只读成员

本文关键字:只读 成员 序列化 Protobuf-net 类型 模型 为什么 | 更新日期: 2023-09-27 18:32:40

我有以下类,我想为它构建一个protobuf-net类型模型:

      [DataContract]
      public class Currency
      {
          [DataMember(Order = 0)]
          private readonly string code;
          public Currency(string code)
          {
              // Initialize members
              this.code = code;
          }
          public string Code
          {
              get { return this.code; }
          }
      }

我按如下方式设置了类型模型:

  var model = TypeModel.Create();
  var typeInModel = model.Add(typeof(Currency), true);
  typeInModel.UseConstructor = false;

当我在添加此类型后查看类型模型中的"字段"成员时,我没有看到代码成员的任何内容。我在这里错过了什么?

更新:现在可以创建类型模型,但序列化仍然不起作用。

为什么 Protobuf-net 类型模型不序列化私有只读成员

我的同事发现,如果您将 DataMember 顺序从:

  [DataMember(Order = 0)]

自:

  [DataMember(Order = 1)]

一切突然都可以很好地构建类型模型,尽管序列化仍然不起作用。

您的代码,如所写(使用您答案中的[DataMember(Order=1)]修复)工作正常。以下:

var obj = new Currency("abc");
var clone = (Currency) model.DeepClone(obj);
Console.WriteLine(ReferenceEquals(obj, clone));
Console.WriteLine(clone.Code);

输出

False
abc

正如我所期望的那样 - 意思是:不同的对象实例,但使用正确的值成功创建。

如果您正在做不同的事情,请告诉我。另请注意,根据评论,在某些平台上,对私人成员的反映受到限制 - 最着名的是Silverlight和Phone 7。

在部分信任模式下运行 WCF 代码时,不支持只读字段(公共和私有)的序列化和反序列化。这是因为生成的 IL 不可验证,因此需要提升的权限。

查看文档。

序列化过程中的某些内容会跳过没有资源库的属性。

这似乎有点黑客,但我通常这样做:

[DataMember]
public string Code {
    get { return this.code; }
    set { }
}

一旦集合在那里,即使它什么都不做,它也会在序列化过程中被拾取。