序列化矢量

时间:2011-03-20 00:35:03

标签: java class serialization collections vector

我正在尝试为我正在制作的游戏实施加载和保存。

我想要保存的是:

  • A char[][](二维数组/矩阵)
  • ArrayList<Entity>

实体是DragonHeroItem的超类。所有这三种类型都可以一次包含在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;
    }

}

我认为代码非常明显。现在我的问题:

  1. 这段代码是否足够?
  2. 我是否需要为DragonItemHero实施特定的序列化方法?
  3. 序列化机制如何处理这样一个事实,即我有一个Entity向量,其中的类型不是Entity,而是派生类? 谢谢你的时间!

  4. 好的,一切似乎都很好,除了一个ArrayList。它未被保存或加载(null pointer exception时调用size())。

    这可能是什么原因?

2 个答案:

答案 0 :(得分:3)

如果您希望整个结构可序列化,那么您还需要使部件可串行化。这在实践中意味着你需要让你的Dragon,Hero和Item类实现Serializable。它只是一个标记界面,因此您只需添加implements Serializable。一些ides(至少是eclipse)可能会抱怨你应该添加一个private long SerialVersionUID,它可能会或者可能不会优化序列化 - 无论如何它并不是绝对必要的。

此要求是递归的 - 任何自定义或不可序列化对象的子部分也必须要处理,例如,如果您的Item类看起来像这样

 public class Item implements Serializable {
    private String s;
    private MyClass c;
    ..

然后你还需要制作MyClass Serializable,它的任何实例变量等等。

答案 1 :(得分:2)

我没有看到Dragon,Item和Hero的特定序列化方法的任何原因,除非你需要一些非常特殊的东西,默认序列化机制无法处理。 (当然这些类需要像Steve B所提到的那样可序列化)

你已经有很多代码,所以我怀疑你已经运行了一些测试。你遇到过某些问题吗?或者你是怎么回事?

<强>更新

我注意到您的代码中的某些方面与您的问题没有直接关系,但无论如何您可能对此感兴趣:

  • 你真的想要使用Vector吗?您的应用程序是否使用多线程并且需要序列化?如果不是,您可能更愿意使用ArrayList等。
  • 处理异常的方式很奇怪。也许你只是这样做,因为这是一个例子......你不应该通过简单地返回true或false来抑制异常。如果你希望调用方法对异常感兴趣,你应该简单地将异常添加到方法signatur(throws ...)并让调用方法关心它。如果您认为在自定义异常中包含此类异常(在上下文中更具表现力),则可能是一种选择。如果您根本不关心异常,那么将其包装到运行时异常中也是可能的。如果成功,您的方法可能根本不会返回任何内容......