为什么Protobuf-net typemodel序列化私有只读成员?

时间:2012-04-27 13:40:34

标签: c# protobuf-net

我有以下课程,我想为其构建一个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;

当我在添加此类型后查看类型模型中的“fields”成员时,我看不到代码成员的任何内容。我在这里缺少什么?

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

4 个答案:

答案 0 :(得分:1)

我的同事发现,如果您更改了DataMember订单:

  [DataMember(Order = 0)]

为:

  [DataMember(Order = 1)]

虽然序列化仍然不起作用,但一切都突然用于构建类型模型。

答案 1 :(得分: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。

答案 2 :(得分:0)

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

查看documentation

答案 3 :(得分:0)

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

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

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

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