2011-03-22 54 views
8

好吧,我可能只是在這裏史詩般的失敗,但我的想法是想說這應該工作。反序列化到自我

假設DataProtect.DecryptData將加密的字符串作爲輸入並將解密的字符串作爲輸出。假定deserializeXML生成適當的對象並從新解密的字符串中返回它。

所以。爲什麼不能這樣工作?

class ArrivedDetails 
{ 
///... 

    internal ArrivedDetails(string encrypted) 
    { 
     this = DataProtect.deserializeXML(DataProtect.DecryptData(encrypted)); 
    } 
///... 

給我的

Cannot assign to '<this>' because it's read only 

更具體的錯誤,,我怎麼能得到這個工作?我基本上想解密對象的XML序列化版本,然後在構造函數中反序列化它。

我打開「你不能」(有解釋),因爲我可以把它放在其他地方,只是分配值,但我的大腦說這樣的事情應該是可能的。

回答

12

不,這是不可能的使用構造函數,你不能重新分配this

使用,而不是一個靜態方法:

public static ArrivedDetails CreateFromString(string encrypted) 
{ 
    return DataProtect.deserializeXML(DataProtect.DecryptData(encrypted)); 
} 

叫它:

ArrivedDetails details = ArrivedDetails.CreateFromString(encrypted); 
+0

雖然我會同意dotalchemy最初的概念應該工作,但靜態方法會訣竅。我喜歡你沒有實例化一個新對象,只是返回它。 – Farhan 2012-07-24 18:48:11

2

你需要的是創建你需要的對象的靜態工廠方法。

class ArrivedDetails 
{ 
///... 

    public static ArrivedDetails CreateFromEncryptedKey(string encrypted) 
    { 
     return DataProtect.deserializeXML(DataProtect.DecryptData(encrypted)); 
    } 
///... 

您最初的方法沒有工作的原因是因爲this是返回從它被調用的對象的私人只讀實例字段。您不能寫入this

3

你不能分配任何東西給「this」。將ArriveDetails更改爲返回反序列化對象的靜態。

class ArrivedDetails 
{ 
    static ArrivedDetails Create(string encrypted) 
    { return DataProtect.deserializeXML(...) } 
} 
3

您可以使用如下所述的反射進行存檔。

A config = DataProtect.deserializeXML(DataProtect.DecryptData(encrypted)); 
foreach (var property in GetType().GetProperties()) 
    if (property.GetCustomAttributes(typeof (XmlIgnoreAttribute), false).GetLength(0) == 0) 
     property.SetValue(this, property.GetValue(tmp, null), null); 

此分配反序列化對象到時間可變的,並且在每個公共屬性與反射覆制的值來this。這段代碼避免了使用XmlIgnore屬性複製屬性。