2012-12-03 55 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); 
}