. net中独立于程序集的序列化
本文关键字:序列化 程序集 独立 net | 更新日期: 2023-09-27 18:06:18
我使用序列化/反序列化技术。BinaryFormatter类。每次创建新的程序集时,即使类结构相同,但程序集版本不同,BinaryFormatter也不能反序列化二进制数据。如果类结构保持不变,是否有可能反序列化二进制缓冲区而不检查汇编版本?
试试这个:
public sealed class CurrentAssemblyDeserializationBinder : SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
return Type.GetType(String.Format("{0}, {1}", typeName, Assembly.GetExecutingAssembly().FullName));
}
}
formatter.Binder = new CurrentAssemblyDeserializationBinder();
formatter.Deserialize(inStream);
线程海报添加:
是的,它有效。只要确保有任何类型的系统。二进制数据中存在通用或其他lib,那么您必须在不进行更改的情况下传递它们。"ResizableControls" -旧程序集库名称,"EntityLib" -新程序集名称。此外,版本号也可以根据需要替换。
public sealed class CurrentAssemblyDeserializationBinder : SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
string name;
if (assemblyName.Contains("ResizableControl"))
{
name = Assembly.GetAssembly(typeof(EntityLib.Pattern)).ToString();
}
else
{
name = assemblyName;
}
return Type.GetType(String.Format("{0}, {1}",
typeName.Replace("ResizableControl", "EntityLib"), name));
}
}
谢谢,这正是我需要的。
这是BinaryFormatter
所固有的。有一些高级的事情你可以做来绕过它(使用替代等),但这并不容易,我真的不建议这样做。
我强烈建议您查看基于合约的序列化器;例如:
-
XmlSerializer
-
DataContractSerializer
(但不是NetDataContractSerializer
) - protobuf-net
(我倾向于最后一个,因为它提供了更有效的输出,并且故意避免了一些更多的版本问题)
在所有这些情况下,数据存储(至少在默认设置下)不包括任何关于类型的知识,除了名称所暗示的契约或指定的(通常在属性中)。
我认为这是一个已知的问题与BinaryFormatter -这里是一个可能的解决方案你可以使用SerializationBinder来控制加载哪种类型——该链接提供了如何使用它(在几乎所有。net语言中)的代码和示例