跨程序集反序列化BinaryFormatter对象:程序集找不到问题求解
解决BinaryFormatter反序列化时程序集不匹配的问题
BinaryFormatter序列化对象时,会将类型所属的程序集完整标识(名称、版本、公钥令牌等)写入序列化文件。你把DB_Para类复制到新程序后,该类属于当前程序集,与原程序集FTF-Para, Version=1.16.0.0的标识不匹配,导致反序列化时抛出程序集找不到的异常。
方法1:修改当前程序集标识与原程序集一致
这是最直接的方案,让你的程序集完全匹配原程序集的标识,无需修改反序列化逻辑:
- 打开项目的
.csproj文件,添加或修改以下配置:<PropertyGroup> <!-- 匹配原程序集名称 --> <AssemblyName>FTF-Para</AssemblyName> <!-- 匹配原程序集版本 --> <AssemblyVersion>1.16.0.0</AssemblyVersion> <AssemblyFileVersion>1.16.0.0</AssemblyFileVersion> <!-- 如果原程序集未签名,无需公钥配置;如果原程序集有签名,需导入对应的密钥对 --> </PropertyGroup> - 保存后重新编译项目,此时你的程序集标识与原程序集完全一致,直接用原反序列化代码即可读取文件。
方法2:自定义SerializationBinder映射类型
如果不想修改当前程序集的名称或版本,可通过自定义SerializationBinder将原程序集的类型映射到当前程序集的DB_Para类:
- 实现自定义Binder类:
public class DB_ParaBinder : SerializationBinder { public override Type BindToType(string assemblyName, string typeName) { // 匹配原程序集标识和类型名(替换为原类的完整命名空间) if (assemblyName == "FTF-Para, Version=1.16.0.0, Culture=neutral, PublicKeyToken=null" && typeName.StartsWith("原命名空间.DB_Para")) { // 返回当前程序集中的DB_Para类型 return typeof(DB_Para); } // 其他类型按默认规则解析 return Type.GetType($"{typeName}, {assemblyName}"); } } - 反序列化时设置Binder:
var formatter = new BinaryFormatter(); // 指定自定义Binder formatter.Binder = new DB_ParaBinder(); using (var stream = File.OpenRead("你的文件路径.fpb")) { var para = (DB_Para)formatter.Deserialize(stream); // 后续处理逻辑 }
关键注意事项
- 确保当前程序中的
DB_Para类与原类结构完全一致:包括字段名、类型、[Serializable]特性、[NonSerialized]标记(比如原类中PropertyChanged事件的[field: NonSerialized]必须保留),否则反序列化可能失败或数据丢失。 - BinaryFormatter在.NET Core/.NET 5+中已被标记为过时,存在安全风险,若后续有迁移计划,建议逐步替换为更安全的序列化方式(如System.Text.Json、Protobuf等),但针对历史文件只能暂时使用该方案。
内容的提问来源于stack exchange,提问作者Toby_Stoe
相关产品推荐
相关产品推荐

