1

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

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

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

4

4 回答 4

1

我的同事发现,如果您将 DataMember 订单从以下位置更改:

  [DataMember(Order = 0)]

至:

  [DataMember(Order = 1)]

尽管序列化仍然无法正常工作,但对于构​​建类型模型而言,一切突然都可以正常工作。

于 2012-04-27T14:06:19.553 回答
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。

于 2012-04-28T20:08:56.870 回答
0

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

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

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

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

于 2012-04-27T15:13:21.157 回答
0

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

看看文档

于 2012-04-27T13:46:57.920 回答