【发布时间】:2015-02-23 21:51:41
【问题描述】:
我知道类似的问题已经被问过很多次,但我没有找到一个实际上相同的问题 - 如果我错过了一个问题,我们深表歉意。
我正在尝试制作一个小游戏。游戏将我的角色(精神)存储到一个数组列表中。通过创建我的 Spirit 类的不同实例来创建具有不同特征的精神。然后我将该实例存储到包含我的聚会的数组列表中。 arraylist 包含 3 个元素。
我想序列化这些实例的所有字段,将它们保存到文件中,然后再次加载它们并将它们存储回数组列表中的正确位置(本质上是在我的游戏中保存/加载)。
有人建议我使用 kyro 进行序列化,所以我正在使用它。不过我很确定代码非常相似,我不得不想象解决这个问题的方式基本相同。
这是我现在的代码
public void usekryo(){
Kryo kryo = new Kryo();
kryo.register(Spirits.class);
Spirits writespirit;
Spirits readspirit;
for(int i=0;i<3;i++) { try (Output output = new Output(new FileOutputStream("spirits.ser"))) {
System.out.println("loop is going");
writespirit = OwnedSpirits.myspirits.get(i);
kryo.writeClassAndObject(output, writespirit);
} catch (FileNotFoundException ex) { System.out.println("fail"); } }
Spirits blankarray = new Spirits();
OwnedSpirits.myspirits.set(0, blankarray);
OwnedSpirits.myspirits.set(1, blankarray);
OwnedSpirits.myspirits.set(2, blankarray);
System.out.println(OwnedSpirits.myspirits.get(2).species);
for(int i=0;i<3;i++) { try (Input input = new Input(new FileInputStream("spirits.ser"))) {
System.out.println("now it's loading");
readspirit = (Spirits) kryo.readClassAndObject(input);
OwnedSpirits.myspirits.set(i, readspirit);
} catch (FileNotFoundException ex) { System.out.println("fail"); } }
System.out.println(OwnedSpirits.myspirits.get(0).species);
System.out.println(OwnedSpirits.myspirits.get(2).species);
}
这最终完全符合我的预期。我的意思是我知道这不能解决我的问题,但我只是确保我正确使用了 kyro。
无论如何,它创建了我的精神类的一个实例,将值加载到我的数组列表的第一个索引中,然后序列化这个新实例。到现在为止还挺好。
但它又做了一次,并覆盖了我第一次写的内容。然后做第三次。因此,实际保存的唯一值是我的数组列表的索引 [2] 中的值。
然后,当我读回该文件并再次写入时,我的数组列表的所有 3 个索引都填充了最初只是我的数组列表的索引 [2]。
那么我到底要怎么写才能让所有 3 个索引都输出到一个文件中,然后再输入到正确的索引中呢?
我希望这不是超级复杂,但我确实很担心。
【问题讨论】:
标签: java serialization arraylist