C# BinaryFormatter二进制序列化及反序列化报错求助
解决BinaryFormatter序列化/反序列化问题的建议
问题背景
你使用BinaryFormatter序列化含自定义成员的类对象时,先后遇到两个问题:
- 未给自定义类添加
[Serializable]特性时,序列化文件内容异常,反序列化报错:End of Stream encountered before parsing was completed. - 添加特性后序列化文件正常,但反序列化报错:
Unable to find assembly 'Lib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
解决步骤
1. 确保反序列化环境存在目标程序集
- 将包含
Lib程序集的DLL文件复制到反序列化程序的运行目录(如bin/Debug/netX.x文件夹)。 - 若为同一解决方案内的项目,直接添加对
Lib项目的引用,确保编译时自动复制依赖文件。
2. 匹配程序集版本与签名
- 检查序列化、反序列化环境中
Lib程序集的版本号、公钥令牌是否完全一致。如果程序集版本更新过,用新版本重新生成序列化文件。 - 若程序集是强签名的,确保两端的公钥令牌相同,避免因签名不匹配导致无法识别。
3. 配置程序集绑定重定向(版本兼容场景)
如果需要兼容不同版本的Lib程序集,可在反序列化程序的配置文件(App.config/Web.config)中添加绑定重定向,让CLR自动映射版本:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Lib" publicKeyToken="null" culture="neutral"/> <bindingRedirect oldVersion="1.0.0.0" newVersion="你的实际程序集版本"/> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
4. 替换BinaryFormatter(长期推荐方案)
BinaryFormatter已被标记为过时,存在安全漏洞且依赖强程序集绑定,建议改用更灵活的序列化方式:
- JSON序列化:使用
System.Text.Json或Newtonsoft.Json,无需依赖特定程序集,跨环境兼容性更强。 - DataContractSerializer:给自定义类添加
[DataContract]、[DataMember]特性,相比BinaryFormatter更可控,程序集依赖问题更容易处理。
内容的提问来源于stack exchange,提问作者user8677843
相关产品推荐
相关产品推荐

