反序列化序列化后的Animal列表时出现End of Stream encountered before parsing was completed异常的解决方案咨询
解决“End of Stream encountered before parsing was completed”异常的办法
嘿,这个问题其实挺典型的,我帮你拆解一下根源和解决办法:
核心问题:重复反序列化导致流耗尽
你的Load方法里犯了一个关键错误——连续调用了两次BinaryFormatter.Deserialize:
object obj = format.Deserialize(fileStream); // 第一次读取,已经把流的内容全读完了 if (obj.GetType() == typeof(List<Animal>)) { List<Animal> Animals = (List<Animal>)format.Deserialize(fileStream); // 第二次读取,流已经到末尾了! }
第一次反序列化已经把文件流里的所有数据读取并解析完毕,此时文件流的指针已经指向了流的末尾。这时候再尝试第二次反序列化,自然就会抛出“流提前结束”的异常。
修正后的Load方法
把两次反序列化合并成一次,直接判断并转换类型即可:
public void Load(String fileName) { if (fileName == null) { throw new ArgumentNullException("fileName"); } // 优化路径处理逻辑 string path = Path.IsPathRooted(fileName) ? fileName : Path.Combine(@"C:\", fileName); using (FileStream fileStream = File.OpenRead(path)) { BinaryFormatter format = new BinaryFormatter(); object obj = format.Deserialize(fileStream); // 使用is运算符做类型判断+转换,更简洁安全 if (obj is List<Animal> loadedAnimals) { Animals = loadedAnimals; // 这里假设Animals是类的成员变量 } } }
额外优化建议
除了核心问题,你的路径处理逻辑也有可以改进的地方:
- 原来的
@"C:" + fileName会生成类似C:test.txt的路径,这其实是相对路径(基于当前工作目录的C盘路径),应该改成@"C:\" + fileName或者用Path.Combine来拼接,避免手动拼接字符串出错。 - 用
fileName.Contains(@"\\")判断是否是绝对路径并不靠谱,比如本地绝对路径C:\test.txt并不包含双斜杠。推荐用Path.IsPathRooted(fileName)来准确判断路径是否为绝对路径。
补充验证点
你的Save方法逻辑看起来没问题,但要确保Animal类已经标记了[Serializable]特性——这是BinaryFormatter序列化的必要条件,如果没加的话,序列化阶段就会出错哦!
内容的提问来源于stack exchange,提问作者user7772779
相关产品推荐
相关产品推荐

