2012-04-27 80 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; 

當我看「場「類型模型中的成員添加此類型後,我沒有看到任何代碼成員。我在這裏錯過了什麼?

更新:現在可以創建類型模型,但序列化仍不起作用。

+0

http://marcgravell.blogspot.de/2011/08/automatic-serialization-whats-in -tuple.html – CodesInChaos 2012-04-27 14:22:29

+0

我現在不在PC上;與0 => 1編輯應該工作正常,但我會稍後檢查。我可以問:你在使用什麼平臺?經常.net? Silverlight的? XNA?什麼? – 2012-04-27 17:00:53

回答

0

在部分信任模式下運行WCF代碼時,不支持只讀字段(公有和私有)的序列化和反序列化。這是因爲生成的IL是不可驗證的,因此需要提升權限。

看看documentation

+0

感謝您的回覆。雖然我使用DataContract/DataMember屬性,但在我的場景中根本沒有使用WCF。我正在使用.net的protobuf序列化庫,它也可以使用這些屬性。 – Franchesca 2012-04-27 14:03:12

1

我的同事發現,如果從改變數據成員的順序:

[DataMember(Order = 0)] 

到:

[DataMember(Order = 1)] 

,一切突然工作正常,爲建設型模式,雖然系列化仍然無法正常工作。

0

序列化過程中的某些內容會跳過沒有setter的屬性。

這似乎是一個黑客攻擊的一位,但我通常這樣做:

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

一旦設定是存在的,即使什麼都不做,它會在序列化過程中回升。

+0

啊!太好了!我會嘗試一下,看看它是怎麼回事:) – Franchesca 2012-04-27 15:52:13

+0

我最初可能錯讀了...你試圖序列化一個變量,但通常序列化發生在屬性本身。這應該仍然有效,但您可能需要將[DataMember]裝飾器添加到您的公共字符串Code屬性 – bugfixr 2012-04-27 15:55:02

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 2012-05-14 09:24:33

相關問題