ObjectOutputStream重复输出问题:读取对象仅显示最后一个元素值
问题原因分析与修复方案
你的问题根源出在**TestScores类中的name和score被声明为static静态变量**,这是核心错误!
为什么会重复输出最后一个对象的值?
静态变量属于类本身,而不是类的实例对象。当你创建多个TestScores对象时,每个对象都会覆盖name和score这两个静态变量的值——最后一个对象赋值后,这两个变量就固定为最后一次的值了。所以不管你序列化多少个对象,读取的时候访问的都是这两个类级别的静态变量,自然只会输出最后一个对象的数值。
修复步骤
- 移除
TestScores类中name和score的static修饰符,把它们改成实例变量:
// 原来的错误代码 static int score, name; // 修改后 private int score; private int name;
- 在
readFile方法中,读取对象后要访问当前对象的实例变量,而不是直接访问类的静态变量:
// 原来的错误代码 System.out.println("Test " + name + " Score: " + score); // 修改后,访问当前读取到的对象的变量 System.out.println("Test " + scoreRead[counter].name + " Score: " + scoreRead[counter].score);
(更规范的做法是给TestScores添加getter方法,比如getName()和getScore(),然后通过方法访问变量,这样符合封装原则)
- 额外优化:
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
相关产品推荐
相关产品推荐

