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

ObjectOutputStream重复输出问题:读取对象仅显示最后一个元素值

问题原因分析与修复方案

你的问题根源出在**TestScores类中的name和score被声明为static静态变量**,这是核心错误!

为什么会重复输出最后一个对象的值?

静态变量属于类本身,而不是类的实例对象。当你创建多个TestScores对象时,每个对象都会覆盖name和score这两个静态变量的值——最后一个对象赋值后,这两个变量就固定为最后一次的值了。所以不管你序列化多少个对象,读取的时候访问的都是这两个类级别的静态变量,自然只会输出最后一个对象的数值。

修复步骤

  1. 移除TestScores类中name和score的static修饰符,把它们改成实例变量:
// 原来的错误代码
static int score, name;

// 修改后
private int score;
private int name;
  1. 在readFile方法中,读取对象后要访问当前对象的实例变量,而不是直接访问类的静态变量:
// 原来的错误代码
System.out.println("Test " + name + " Score: " + score);

// 修改后,访问当前读取到的对象的变量
System.out.println("Test " + scoreRead[counter].name + " Score: " + scoreRead[counter].score);

(更规范的做法是给TestScores添加getter方法,比如getName()和getScore(),然后通过方法访问变量,这样符合封装原则)

  1. 额外优化:writeFile方法里的objectOut.reset()其实可以去掉——因为你每次写入的是不同的实例对象(修复后每个实例都有自己的数据),reset()主要是用来重置序列化的对象缓存,避免重复写入同一个对象时只写引用的问题,这里你的场景不需要。

修复后的关键代码片段

修改后的TestScores类核心部分:

public class TestScores implements Serializable {
    static TestScores[] scoreArray, scoreRead;
    // 改为实例变量
    private int score;
    private int name;

    TestScores(int test, int num) throws InvalidTestScore {
        name = test;
        score = num;
        if (num >= 100 || num <= 0) {
            throw new InvalidTestScore();
        }
    }

    // 可选:添加getter方法
    public int getName() {
        return name;
    }

    public int getScore() {
        return score;
    }

    public static void readFile(int ALENGTH) throws IOException, ClassNotFoundException {
        FileInputStream inStream = new FileInputStream("objects.dat");
        try (ObjectInputStream objectIn = new ObjectInputStream(inStream)) {
            scoreRead = new TestScores[ALENGTH];
            for (int counter = 0; counter < ALENGTH; counter++) {
                scoreRead[counter] = (TestScores) objectIn.readObject();
                // 使用实例变量或者getter方法
                System.out.println("Test " + scoreRead[counter].getName() + " Score: " + scoreRead[counter].getScore());
            }
        }
        System.out.println("Reading success.");
    }
}

这样修改后,每个TestScores对象都会保存自己独立的name和score值,序列化和读取后就能正确输出每个对象的变量了。

内容的提问来源于stack exchange,提问作者Kacey VH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:15:05