【发布时间】:2013-09-18 20:22:00
【问题描述】:
我将我的类的一个实例序列化到一个文件中(使用BinaryFormatter)
之后,在另一个项目中,我想反序列化这个文件,但它不起作用,因为我的新项目没有旧类的描述。 .Deserialize() 出现异常
Unable to find assembly '*MyAssembly, Version=1.9.0.0, Culture=neutral, PublicKeyToken=null'.*".
但我有包含我想要反序列化的旧类的描述的程序集的 .DLL。
我不想在项目中添加对这个 DLL 的引用(我希望能够反序列化任何类型的程序集的类...)
如何通知序列化器/反序列化器使用我动态加载的程序集?
【问题讨论】:
-
只要程序集被加载(无论是动态加载还是通过添加对它的引用),序列化程序就应该找到它。你说这个“我如何通知序列化器/反序列化器使用我动态加载的程序集?”。这意味着程序集已经“加载”,您需要做的就是“通知序列化器/反序列化器”关于“加载”。这是一个矛盾。 Serializer/Deserializer 不需要知道任何事情。如果您已加载程序集,那么它将使用它。所以加载程序集。你不能逃避不加载它。要动态加载程序集,请使用 Assembly.LoadFrom
-
techdigger.wordpress.com/2007/12/22/… 发布此内容以防其他人需要。这里给出的解决方案是提供一个自定义的 SerializationBinder 类,重写 BindToType 方法以提供反序列化类型。
-
您可以使用AppDomain.AssemblyResolve,如SerializationException for dynamically loaded Type 所示。我认为自定义
SerializationBinder也应该可以工作,请参阅BinaryFormatter deserialize gives SerializationException 和How to create a SerializationBinder for the Binary Formatter that handles the moving of types from one assembly and namespace to another。 -
我自己从来没有使用过 BinaryFormatter,但是你能不能换一条路,而不是像序列化自己那样使用 BinaryFormatter?例如,请在此处查看示例stackoverflow.com/a/1676053/2936309。此处提到的元数据可能与您在反序列化时需要完全相同的 dll 的原因相同。你能自己做一些工作来解决这个问题吗?
标签: c# .net serialization .net-assembly