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;

この型を追加した後、型モデルの「fields」メンバーを見ると、コードメンバーには何も表示されません。ここで何が欠けていますか?

更新:タイプモデルを作成できるようになりましたが、シリアル化はまだ機能しません。

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 に答える