将我的 arraylist 中引用的对象序列化到一个文件中,然后将它们加载回该 arraylist
Serializing objects referenced in my arraylist into one file, and then loading them back into that arraylist
我知道类似的问题已被问过很多次,但我没有找到真正相同的问题 - 如果我错过了一个,请道歉。
我正在尝试做一个小游戏。游戏将我的角色(精神)存储到数组列表中。通过创建我的精神 class 的不同实例,可以创建具有不同特征的精神。然后我将该实例存储到举办我的派对的数组列表中。数组列表包含 3 个元素。
我想序列化这些实例的所有字段,将它们保存到一个文件中,然后再次加载它们并将它们存储回数组列表中的正确位置(在我的游戏中基本上是 save/load) .
有人建议我使用 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。
无论如何,它创建了我的精神实例 class,将值加载到我的 arraylist 的第一个索引中,然后序列化这个新实例。到目前为止,一切都很好。
但是又重复了一次,覆盖了我第一次写的内容。然后进行第 3 次。因此,实际保存的唯一值是我的数组列表的索引 [2] 中的值。
然后,当我读回该文件并再次写入时,我的 arraylist 的所有 3 个索引都填充了最初只是我的 arraylist 的索引 [2]。
那么我到底要怎么写才能将所有 3 个索引输出到一个文件,然后再输入回它们正确的索引?
我希望这不是超级复杂,但我确实很担心它。
你让它变得比需要的更复杂。您应该能够序列化容器 (OwnedSpirits.myspirits)。
我知道类似的问题已被问过很多次,但我没有找到真正相同的问题 - 如果我错过了一个,请道歉。
我正在尝试做一个小游戏。游戏将我的角色(精神)存储到数组列表中。通过创建我的精神 class 的不同实例,可以创建具有不同特征的精神。然后我将该实例存储到举办我的派对的数组列表中。数组列表包含 3 个元素。
我想序列化这些实例的所有字段,将它们保存到一个文件中,然后再次加载它们并将它们存储回数组列表中的正确位置(在我的游戏中基本上是 save/load) .
有人建议我使用 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。
无论如何,它创建了我的精神实例 class,将值加载到我的 arraylist 的第一个索引中,然后序列化这个新实例。到目前为止,一切都很好。
但是又重复了一次,覆盖了我第一次写的内容。然后进行第 3 次。因此,实际保存的唯一值是我的数组列表的索引 [2] 中的值。
然后,当我读回该文件并再次写入时,我的 arraylist 的所有 3 个索引都填充了最初只是我的 arraylist 的索引 [2]。
那么我到底要怎么写才能将所有 3 个索引输出到一个文件,然后再输入回它们正确的索引?
我希望这不是超级复杂,但我确实很担心它。
你让它变得比需要的更复杂。您应该能够序列化容器 (OwnedSpirits.myspirits)。