2009-04-30 147 views
1

在我維護的應用程序(C#)中,有一些序列化對象存儲在數據庫中,有些是在幾個版本之前創建的。SoapFormatter版本控制問題

現在,當應用程序試圖反序列化這些對象,它拋出一個異常: 解析錯誤,沒有與XML密鑰相關聯的組裝....(程序集名稱和版本)

據我瞭解,當SoapFormatter嘗試反序列化對象,它首先檢查反序列化程序集是否與序列化程序集相同,如果不是,則會拋出上述錯誤消息。情況會是這樣嗎?

如果是這樣的話,有沒有辦法將這些舊數據轉換爲使它們可以被最新版本的應用程序讀取?

在附註中,我正在考慮編寫一個程序,使其具有相同的程序集名稱和版本,以假裝它們是序列化這些對象的相同程序集,有可能嗎?

回答

0

約旦提到的XSLT轉換可能會工作,但在我的情況下,我需要改變一些屬性和節點名稱使它變得相當複雜。

最後我只是用Regex.Replace變化了的程序集名稱和成員名稱轉換,像這樣的東西:

newData = Regex.Replace(textData, "(" + String.Join("|", keys) + ")", 
         new MatchEvaluator(this.EvaluateReplacement)); 

string EvaluateReplacement(Match m) 
{ 
    if (this.convertDict.ContainsKey(m.Value)) 
    { 
     return this.convertDict[m.Value]; 
    } 
    return m.Value; 
} 

其中this.convertDict是包含轉換映射Dictionary對象。

1

我還沒有嘗試過這一點,但我想知道是否可以使用XSLT將舊版本轉換爲更新的「版本」結構。

+0

感謝您的答覆,但是序列化對象不在XML但在一些有點像「PFNPQVAtRU5WOkVudmVsb3BlIHhtbG5zOnhzaT0iaHR0cDovL3d3d ......」二進制數據的 – FlyinFish 2009-04-30 23:38:50