序列化类型化数据集,更新程序集,反序列化错误

时间:2012-12-03 09:23:27

标签: c# serialization strongly-typed-dataset

我的项目使用类型化数据集来处理其数据。一些数据表中的某些列使用自定义程序集中的类型。序列化数据集时,它会保存列和数据类型,如此

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

现在当程序集MyAssembly更新时,这个全名不再匹配,所以当程序重新运行并尝试反序列化xml时,会抛出一个异常,说它无法找到版本6.3.1.0的程序集。

我尝试删除全名,如下所示,只是保留类型,但这不合法。

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

有没有人知道在使用更新的程序集类型时如何反序列化?

2 个答案:

答案 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。

答案 1 :(得分: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);
}