2012-04-27 9 views
1

私は私がいるProtobufネットtypemodelを構築したいと思います以下のクラスがあります。次のように私はタイプのモデルを設定なぜProtobuf-netのtypemodelは非公開の読み取り専用メンバーをシリアル化しませんか?

 [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; 

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

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

+0

http://marcgravell.blogspot.de/2011/08/automatic-serialization-whats-in -tuple.html – CodesInChaos

+0

私は現在PCにいません。 0 => 1の編集でうまくいくはずですが、後で確認します。私は聞くことができます:あなたはどのプラットフォームを使用していますか?通常のネット。 Silverlight? XNA?何? –

答えて

0

部分信頼モードでWCFコードを実行すると、読み取り専用フィールド(パブリックとプライベートの両方)のシリアル化と非シリアル化はサポートされません。これは、生成されたILが検証不可能であり、したがって高い権限を必要とするためです。

documentationをご覧ください。

+0

お返事ありがとうございます。私はDataContract/DataMember属性を使用していますが、私のシナリオではWCFを実際に使用していません。私はこれらの属性を利用することができる.net用のprotobuf直列化ライブラリを使用しています。 – Franchesca

1

私の同僚が発見した、あなたがからデータメンバーの順序を変更する場合:

[DataMember(Order = 0)] 

へ:連載はまだ動作しませんが、すべてが突然、型モデルを構築するため正常に動作することを

[DataMember(Order = 1)] 

0

serializeプロセスの何かが、セッターのないプロパティをスキップします。

それはハックのビットのように思えるが、私は通常、この操作を行います。セットがある

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

たら、それは何もしないにも関わらず、それはシリアル化プロセスでピックアップされますが。

+0

ああ!ニース!私はこれを試して、それがどうなるか見てみましょう:) – Franchesca

+0

私は最初に誤読をしているかもしれません...あなたは変数をシリアル化しようとしていますが、一般にシリアル化はプロパティ自体で起こります。これでも動作するはずですが、パブリック文字列に[DataMember]デコレータを追加する必要があります。Codeプロパティ – bugfixr

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)に限定されていることに注意してください。

+0

応答をありがとう。私の仲間は、私がホールにいる間にそれを調べていました。使用する前にモデルをコンパイルしていたので、問題が起きているようです。 – Franchesca

関連する問題