gpt4 book ai didi

C#反序列化已移动或重命名的类

转载 作者:太空狗 更新时间:2023-10-29 20:26:06 26 4
gpt4 key购买 nike

如果我在名为“AssemblyA”的程序集中有一个名为“MyClass”的类,并使用 .NET 的 BinaryFormatter 将其序列化为一个文件。然后将“MyClass”的代码移动到名为“AssemblyB”的程序集中并尝试反序列化文件我得到以下“System.TypeLoadException”异常:

Could not load type 'AssemblyA.MyClass' from assembly 'AssemblyA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

有什么方法可以表明该类已移至 AssemblyB?通过某种属性?或者是否可以修改序列化文件作为预处理步骤,将所有引用从 AssemblyA.MyClass 更改为 AssemblyB.MyClass?最后,如果这些选项都不可行,是否可以绕过尝试反序列化此类并继续反序列化其余数据?

最佳答案

如果你已经移动了它,那么在它现在所在的位置添加一个对 dll 的引用,并使用 TypeForwardedToAttribute :

[assembly:TypeForwardedTo(typeof(TheType))]

这对于某些请求(包括 BinaryFormatter IIRC)来说已经足够了,它们正在寻找一种类型以在新程序集中找到它。但是,IIRC 它仅适用于最外层类型(不适用于嵌套类型,并且可能不适用于泛型),并且您不能重命名它/更改 namespace 等。

重命名是骗人的……BinaryFormatter 对这类事情是出了名的脆弱。 IMO,它只适用于序列化两个紧密耦合的系统之间的 transient 数据(例如,在同一进程中的两个 AppDomain 之间交换;当用于存储时,或在可能不同步的系统之间,这可能是一场噩梦。

可能为时已晚,但我建议使用基于契约的序列化程序(而不是基于类型的序列化程序); XmlSerializerDataContractSerializer 中的任何一个(只要您使用 [DataContract]/[DataMember] 属性),等等。如果你想要快速的二进制文件,protobuf-net 会做得很好(如果你需要,可以挂接到 ISerializable)。

另一个可能值得研究的概念是序列化代理,但这相对较难。但是 IIRC 这使您可以控制所创建的类型 - 但您需要为其做很多工作。

关于C#反序列化已移动或重命名的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1465079/

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