我正在尝试为我正在制作的游戏实施加载和保存。
我想保存一个Maze
,其中包含ArrayList
Entity
的其他属性。
实体是Dragon,Hero和Item的超级类。所有这三种类型都可以一次包含在载体中。
使用“自动”序列化机制(将implements Serializable
添加到Maze
)会保存除ArrayList
之外的所有属性。
为什么会这样?
为了完整起见,我的代码在下面。
package logic;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public final class LoadAndSave {
public static final transient boolean available = false;
public static final boolean serialize(Object obj) {
// Write to disk with FileOutputStream
FileOutputStream saveFile;
try {
saveFile = new FileOutputStream("game.sav");
} catch (FileNotFoundException e) {
return false;
}
// Write object with ObjectOutputStream
ObjectOutputStream objOut;
try {
objOut = new ObjectOutputStream(saveFile);
} catch (IOException e) {
//
return false;
}
// Write object out to disk
try {
objOut.writeObject(obj);
} catch (IOException e) {
return false;
}
return true;
}
public static final Object load() {
FileInputStream fileIn;
try {
fileIn = new FileInputStream("game.sav");
} catch (FileNotFoundException e1) {
return null;
}
// Read object using ObjectInputStream
ObjectInputStream objIn;
try {
objIn = new ObjectInputStream(fileIn);
} catch (IOException e) {
return null;
}
// Read an object
Object obj;
try {
obj = objIn.readObject();
} catch (IOException e) {
return null;
} catch (ClassNotFoundException e) {
return null;
}
return obj;
}
}
答案 0 :(得分:6)
Entity
是否也可序列化? (你提到只是迷宫是可序列化的。)
确保列表未定义为瞬态或静态,否则序列化机制将跳过该列表。
答案 1 :(得分:1)
您需要确保关闭流。您的load()代码可以简化为如下所示:
ObjectInputStream objIn = null;
try {
objIn = new ObjectInputStream(new FileInputStream("game.sav"));
return objIn.readObject();
} catch (Exception exception) {
// Deal with errors
return null;
} finally {
if (objIn != null) {
try {
objIn.close();
} catch (Exception exception) {}
}
}
serialise()可以用类似的方式改变。
答案 2 :(得分:1)
我使用以下假设检查了您的代码:
class Entity implements Serializable {}
和
private char[][] mazeWalls = new char[0][0];
private Vector<Entity> entities = new Vector<Entity>();
...它完美地工作,序列化和反序列化空Entity
个对象......