如何创建一个文件来存储ArrayList Java中的对象

时间:2014-03-04 16:32:12

标签: java file arraylist

我正在创建一个基本上是2D Minecraft的游戏,我正在为每个块(X,Y,对象类型)创建一个带有3个参数的新对象。游戏本身有效,但我无法保存,因为每次使用保存功能时它都会崩溃。 (java.io.NotSerializableException) - 为什么不呢?
所以这里有我的Array List,它存储了Objects:

    public static ArrayList<Objects> list = new ArrayList<Objects>();

这是我的名为Objects的类:

public class Objects{

public int ObjectX;
public int ObjectY;
public int ObjectName;
public int ObjectSize = Game.ObjectSize;

public Objects(int x, int y, int n) {
    ObjectX=x;
    ObjectY=y;
    ObjectName=n;
}

public void render(Graphics g){ 
    if(ObjectX*ObjectSize-Game.x+ObjectSize > 0 && ObjectX*ObjectSize-Game.x <     Game.w && ObjectY*ObjectSize-Game.y+ObjectSize > 0 && ObjectY*ObjectSize-Game.y < Game.h){       
        if(ObjectName!=1){  
    g.setColor(Color.BLACK);
    g.fillRect(ObjectX*ObjectSize-Game.x, ObjectY*ObjectSize-Game.y,ObjectSize,ObjectSize);
        }
        if(ObjectName==2){
    g.setColor(Color.GREEN);
    g.fillRect(ObjectX*ObjectSize +1-Game.x, ObjectY*ObjectSize +1-Game.y,ObjectSize-2,ObjectSize-2);
        }
        if(ObjectName==3){
    g.setColor(new Color(139,69,19));
    g.fillRect(ObjectX*ObjectSize +1-Game.x, ObjectY*ObjectSize +1-Game.y,ObjectSize-2,ObjectSize-2);
        }
    }
}

public void tick(){

}
}

所以我尝试了一些东西,但我不能让它工作?我真的需要一些帮助。

//write
public void save(String filename) throws FileNotFoundException {
    doing = "Saving...";
    try{
        File file = new File(filename);
        if(!file.exists()) {
            file.createNewFile();
        } 
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);

oos.writeObject(list);
oos.close();
    }catch(IOException e){
        e.printStackTrace();
    }
    SAVE=false;
}

1 个答案:

答案 0 :(得分:1)

假设我想将Foo的实例写入文件。我需要Foo实施Serializable,如下所示:

public class Foo implements Serializable {}

如果Foo可序列化,则Foo内的每个对象也必须也是如此。如果Foo包含BarBar也必须实施Serializable。如果Bar包含ArrayList<Baz>,则Baz必须是可序列化的。 ArrayList已经可序列化,因此您无需担心。

请注意,您实际上不必为可序列化的对象实现任何内容。您只需使用正确的界面进行标记即可。