gpt4 book ai didi

C# BinaryFormatter - 使用另一个命名空间中的对象反序列化

转载 作者:太空狗 更新时间:2023-10-29 17:51:59 25 4
gpt4 key购买 nike

最近,我们将一部分代码移到了不同​​的项目库中。

不幸的是,这些数据似乎已使用 BinaryFormatter 序列化到数据库中(不要问我为什么,我不知道,我讨厌这个想法)。

现在我负责创建一个更新数据库的更新工具(该工具根据版本检测到需要更新的数据库时由我们的软件自动启动):

  1. 创建新列
  2. 反序列化二进制列
  3. 将反序列化的列写入新列
  4. 删除旧的二进制列

我的问题是,当我尝试反序列化时,它告诉我:

Unable to find assembly 'MyOldAssemblyName, Version=2.0.0.0, Culture=neutral, PublicKeyToken=a5b9cb7043cc16da'.

但是这个程序集已经不存在了。我可以将此类放入我的“更新程序”项目中,但我无法让这个旧项目只包含此文件。

有没有办法指定 BinaryFormatter 必须反序列化它接收到的具有指定类的 Stream?

或者说程序集改名了,还是???

最佳答案

要告诉它类型已在程序集之间移动(但它保留旧名称和 namespace ),您有时可以使用(在程序集中)[assembly:TypeForwardedTo( typeof(TheType))]。这里的“有时”是因为您需要使用 typeof,这意味着您需要从旧程序集到新程序集的引用,这并不总是可能的 - 但经常 是(特别是如果您将类型从 UI 层向下移动到 POCO/DTO 层,因为 UI 通常引用 POCO/DTO)。

但是,如果您重命名了已更改命名空间的类型,则需要您编写自定义“ Binder ”( see here )。

需要注意的是,BinaryFormatter 本质上是一个基于类型的序列化程序,在对代码进行版本控制或重构时,您总会遇到很多问题。如果类型不是“写一次,就永远不会改变它”,那么我会强烈建议使用更灵活的东西 - 一些契约 基于而不是基于类型。基本上,除了 BinaryFormatter(或 NetDataContractSerializer)之外的任何东西:XmlSerializerDataContractSerializer、protobuf-net 、Json.NET 等都可以,不会关心您是否重新定位或重命名了类型。

关于C# BinaryFormatter - 使用另一个命名空间中的对象反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19490113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com