2012-12-03 138 views
1

我的項目使用類型化數據集來處理它的數據。一些數據表中的某些列使用自定義程序集中的類型。當一個數據集被序列化,這樣可以節省現在,當組裝,MyAssembly程序進行更新,這個全名不再匹配,從而當程序重新運行,並試圖反序列化XML,中的列和數據類型,像這樣序列化類型化數據集,更新程序集,反序列化錯誤

<xs:element name="Mode" msdata:DataType="MyAssembly.Adapters.Mode, MyAssembly, Version=6.3.1.0, Culture=neutral, PublicKeyToken=dab9b4e6f12a95d2" type="xs:anyType" minOccurs="0" /> 

拋出異常說它不能找到版本6.3.1.0的程序集。

我試圖刪除全名,如下所示,只是離開類型,但這是不合法的。

<xs:element name="Mode" msdata:DataType="MyAssembly.Adapters.Mode" type="xs:anyType" minOccurs="0" /> 

有誰知道如何反序列化,而使用更新程序集的類型?

回答

1

我後來不得不重新審視這幾年,我卻高興不起來這個解決方案,並提醒,這看上去就像由binding redirection解決了這個問題。

將以下內容添加到主應用程序項目的配置文件中。它應該輸出app.exe.config。

<configuration> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="Assembly" publicKeyToken="token" culture="neutral" /> 
     <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
</configuration> 

如果是NUnit,則將應用程序配置文件添加到NUnit項目中。它應該輸出Assembly.dll.config

現在重寫XML不是必需的。

0

我想出的解決方案是用最新的程序集版本號重寫xml。

在運行時您可以找到您期望的程序集版本號,並執行正則表達式搜索和替換。

引發反序列化類型化數據集和異常的一個有趣的注意事項是您將不得不創建另一個新數據集來讀入,因爲在引發異常之前表字段和關係可能已經創建。

DataSet untypedds = new DataSet(); 
try { 
    untypedds.ReadXml(xmlPath, XmlReadMode.ReadSchema); 
} 
catch (FileLoadException) { 
    untypedds = new DataSet(); // Need the new DataSet here 
    RewriteXml(xmlPath); 
    untypedds.ReadXml(xmlPath, XmlReadMode.ReadSchema); 
}