【问题标题】:Serializing a vector序列化向量
【发布时间】:2011-03-20 00:35:02
【问题描述】:

我正在尝试为我正在开发的游戏实现加载和保存。

我要保存的是:

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

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,而是派生类? 感谢您的宝贵时间!

好的,一切似乎都很好,除了ArrayList 之一。它要么没有被保存或加载(null pointer exception 调用 size() 时)。

这可能是什么原因?

【问题讨论】:

  • 这很容易验证自己 - 只需序列化和反序列化您的对象并将字段值与原始值进行比较。

标签: java class serialization collections vector


【解决方案1】:

如果您希望整个结构可序列化,那么您还需要使部分可序列化。这在实践中意味着您需要让您的 Dragon、Hero 和 Item 类实现 Serializable。只是一个标记界面,所以只需要添加implements Serializable。一些ide(至少是eclipse)可能会抱怨你应该添加一个private long SerialVersionUID,这可能会或可能不会优化序列化 - 在任何情况下它都不是绝对必要的。

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

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

那么您还需要使 MyClass 可序列化,它的任何实例变量等。

【讨论】:

  • 您好,添加了一个新问题。请看一看。
【解决方案2】:

我看不出为 Dragon、Item 和 Hero 提供特定序列化方法的任何理由,除非您需要一些默认序列化机制无法处理的非常特殊的东西。 (当然,史蒂夫 B 提到,这些类需要可序列化)

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

更新:

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

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

【讨论】:

  • 我还没有运行测试,这段代码还是初步的。我想确保我事先解决了我可能遇到的问题。关于您的更新:vector 的缺点是什么?关于异常处理,我真的更愿意在本地处理它们,只是让调用过程获得一个指示成功的布尔值。从长远来看,不这样做会导致意大利面条代码。此类同时提供 TUI 和 GUI。
  • 使用vector的缺点是它的方法是同步的。因此,当调用这些时,所需的同步机制会产生一些开销。 ArrayList 的行为方式与 Vector 完全相同。这里的区别是 ArrayList 不同步。因此,您应该仅在由于并发访问而确实需要同步时才使用 Vector。即使有并发访问,仅仅使用 Vector 通常也不够,因为同步仅限于单个方法调用(例如,添加和删除是两个原子步骤)
  • 好的,改成ArrayList。介意看看我的新情况吗?提前致谢。
猜你喜欢
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 2014-03-03
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
相关资源
最近更新 更多