Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 序列化向量_Java_Class_Serialization_Collections_Vector - Fatal编程技术网

Java 序列化向量

Java 序列化向量,java,class,serialization,collections,vector,Java,Class,Serialization,Collections,Vector,我正在尝试为我正在开发的游戏实现加载和保存 我想保存的是: 一个char[][]二维数组/矩阵 法官 实体是龙、英雄和物品的超类。这三种类型都可以同时包含在ArrayList中 到目前为止,我有: package logic; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; impo

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

我想保存的是:

一个char[][]二维数组/矩阵 法官 实体是龙、英雄和物品的超类。这三种类型都可以同时包含在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;
    }

}
我认为这段代码很容易解释。现在回答我的问题:

这个代码足够吗? 我是否需要为Dragon、Item和Hero实现特定的序列化方法? 序列化机制将如何处理这样一个事实:我有一个实体向量,其中包含的类型不是实体,而是派生类? 谢谢你的时间! 好的,除了ArrayList之外,一切似乎都很好。调用size时,可能未保存或加载空指针异常


这可能是因为什么?

我看不出有任何理由为Dragon、Item和Hero指定特定的序列化方法,除非您需要一些默认序列化机制无法处理的非常特殊的内容。 当然,正如SteveB所提到的,这些类需要是可序列化的

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

更新:

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

你真的想用向量吗?您的应用程序是否使用多线程,并且需要序列化?如果不是,您可能更喜欢使用ArrayList或其他。 处理异常的方式非常奇怪。也许你这样做只是因为这是一个例子。。。您不应该通过简单地返回true或false来抑制异常。如果您希望调用方法对异常感兴趣,那么只需将异常添加到Signature抛出的方法中即可。。。并让调用方法关注它。如果您觉得这样做不合适,那么可以选择将此类异常包装到自定义异常中,因为自定义异常在上下文中更具表现力。如果您根本不关心异常,那么也可以将其包装到运行时异常中。如果成功,您的方法可能不会返回任何结果。。。
我不认为有任何理由为Dragon、Item和Hero指定特定的序列化方法,除非您需要一些默认序列化机制无法处理的非常特殊的东西。 当然,正如SteveB所提到的,这些类需要是可序列化的

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

更新:

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

你真的想用向量吗?您的应用程序是否使用多线程,并且需要序列化?如果不是,您可能更喜欢使用ArrayList或其他。 处理异常的方式非常奇怪。也许你这样做只是因为这是一个例子。。。您不应该通过简单地返回true或false来抑制异常。如果您希望调用方法对异常感兴趣,那么只需将异常添加到Signature抛出的方法中即可。。。并让调用方法关注它。如果您觉得这样做不合适,那么可以选择将此类异常包装到自定义异常中,因为自定义异常在上下文中更具表现力。如果您根本不关心异常,那么也可以将其包装到运行时异常中。如果成功,您的方法可能不会返回任何结果。。。
如果您希望整个结构可以序列化,那么您还需要使部分也可以序列化。实际上,这意味着您需要使Dragon、Hero和Item类实现可序列化。它只是一个标记接口,所以您只需要添加可序列化的实现。有些IDE(至少是eclipse)可能会抱怨说,您应该添加一个私有的长SerialVersionUID,它可能会优化序列化,也可能不会优化序列化—无论如何,这不是严格必要的

这个需求是递归的——它们的任何子部分都是自定义的或不可序列化的对象,因此,例如,如果您的Item类看起来像这样

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

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

如果您希望整个结构可序列化,那么您还需要使部分可序列化。实际上,这意味着您需要使Dragon、Hero和Item类实现可序列化。它只是一个标记接口,所以您只需要添加可序列化的实现。有些IDE(至少是eclipse)可能会抱怨说,您应该添加一个私有的长SerialVersionUID,它可能会优化序列化,也可能不会优化序列化—无论如何,这不是严格必要的

这个需求是递归的——它们的任何子类 作为自定义或不可序列化对象的艺术也必须处理,例如,如果您的Item类如下所示

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

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

我还没有运行测试,这段代码还是初步的。我想确保我事先解决了可能遇到的问题。关于你的更新:vector的缺点是什么?关于异常处理,我更愿意在本地处理它们,让调用过程得到一个表示成功的布尔值。从长远来看,不这样做将导致意大利面代码。这个类同时服务于TUI和GUI。使用vector的缺点是它的方法是同步的。因此,在调用这些函数时,所需的同步机制会有一点开销。ArrayList的行为方式与Vector的行为方式非常相同。这里的区别是ArrayList不同步。所以,只有当由于并发访问而确实需要同步时,才应该使用Vector。即使存在并发访问,简单地使用Vector通常也是不够的,因为同步仅限于单个方法调用,例如添加和删除是两个原子步骤。Sok将其更改为ArrayList。介意看看我的新情况吗?提前谢谢。我还没有运行测试,这段代码还是初步的。我想确保我事先解决了可能遇到的问题。关于你的更新:vector的缺点是什么?关于异常处理,我更愿意在本地处理它们,让调用过程得到一个表示成功的布尔值。从长远来看,不这样做将导致意大利面代码。这个类同时服务于TUI和GUI。使用vector的缺点是它的方法是同步的。因此,在调用这些函数时,所需的同步机制会有一点开销。ArrayList的行为方式与Vector的行为方式非常相同。这里的区别是ArrayList不同步。所以,只有当由于并发访问而确实需要同步时,才应该使用Vector。即使存在并发访问,简单地使用Vector通常也是不够的,因为同步仅限于单个方法调用,例如添加和删除是两个原子步骤。Sok将其更改为ArrayList。介意看看我的新情况吗?提前谢谢。您好,添加了一个新问题。请看一看。您好,添加了一个新问题。请看一看。这很容易验证您自己-只需序列化和反序列化您的对象并将字段值与原始值进行比较。这很容易验证您自己-只需序列化和反序列化您的对象并将字段值与原始值进行比较。