You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

反序列化序列化后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 17:42:30