二进制序列化程序 - 使用序列化文件更改可序列化类的位置

时间:2012-01-25 19:28:21

标签: .net serialization binary

我有一个表示用于针对数据存储构建查询的搜索条件的类。此类是可序列化的,允许将类实例保存到磁盘并重新加载,从而提供保存搜索以重用它们的业务级功能。

这是问题所在;我最近更改了可以序列化的类的位置。我没有改变所述类的结构,我只将它从一个项目(原来的名称不再存在)转移到另一个项目。通过这样做,我意识到我刚刚打破了基于类的文件的反序列​​化,因为它存在于其先前的位置。

如果可能的话,我需要能够"转换"这些文件。虽然文件是二进制格式,但是大部分文件都可以作为纯文本读取,包括现在无效的命名空间。但是,只是更改我可以看到的所述文件的文本会破坏它,所以显然我错过了一些东西。

有没有办法将文件更新为某种批处理,或者将序列化程序指向新的类位置,以便可以对文件进行反序列化?

2 个答案:

答案 0 :(得分:1)

您可以在每个命名空间中创建一个包含可序列化类的两个副本的小程序。然后,您可以使用旧命名空间中的类从文件中读取数据,并为每个实例在新命名空间中创建类的实例,您可以在其中复制所有字段。然后,您可以将新类序列化回文件。

答案 1 :(得分:0)

您可以使用TypeForwardedToAttribute来解决此问题,这样当系统查看程序集时,它无法找到该类型,但它会找到该属性并再次查看新程序集。有关用法,请参阅MSDN,但这适用于BinaryFormatter。

但是,我强烈建议转向基于合同的序列化程序,例如protobuf-net。这不会关心您重新定位,重命名等类型或成员。 BinaryFormatter是...... Prickly。