保存游戏数据 - Java

时间:2015-03-09 17:36:43

标签: java save

我创造了一个带有少量物体的基本游戏。我想让程序的用户能够保存和加载程序的状态。

我研究了多篇文章,并阅读了很多过多的帖子。我对这些方法的数量以及每种方法的复杂性感到惊讶。

大多数方法都要求我创建我想要保存的所有对象的框架或框架,然后逐行加载它们,手动调用每个对象,然后将其强制转换回其数据类型和类。

是的,我是编程新手。但我不是要求分发。我要求简明扼要的解释。

我阅读了下面的文章,因为我探讨了输出到XML文件的想法。

http://www.mkyong.com/java/how-to-create-xml-file-in-java-dom/

正如我所说,我是编程新手。我应该和Java一起学习XML吗?

我的问题如下:

A)成功编译后,我的IDE不知道我有多少个对象,它们的数据类型以及它们属于哪个类?

B)有没有办法保存所有对象而不单独指定它们。

c)我是否过度使用保存简单程序的复杂性?

3 个答案:

答案 0 :(得分:5)

  

我是否应该与Java一起学习XML?

除非您想学习XML或认为XML是您的应用程序的一个不错的选择,否则没有理由。有许多方法可以在没有XML的情况下进行序列化。

  

成功编译后,我的IDE不知道我拥有多少个对象,它们的数据类型以及它们属于哪个类?

不,它不必。由于分配是在Java中动态完成的,因此有些情况甚至无法静态地知道这些信息。

Foo[] foos = new Foo[ new Scanner(System.in).nextInt() ];
for(int i = 0; i < foos.length; ++i)
    foos[i] = new Foo();

(创建了多少个Foo?编译器不知道。)

当然,编译器对数据的类型有很多了解。

  

B)有没有办法保存所有对象而不单独指定它们。

也许使用Serializable。基本上,您将所有程序状态放在一个对象中。当您序列化该单个对象时,其他所有内容都会以递归方式进行序列化。

class FooState implements Serializable {
    Integer a, b, c; // Integer and String
    String d, e, f;  // also implement Serializable
}

class Foo {
    static FooState allMyState = new FooState();

    public static void main(String[] args) throws IOException {
        try(ObjectOutputStream oos = new ObjectOutputStream(
                new FileOutputStream(new File("myFile.data")))) {
            // no need to specify members individually
            oos.writeObject(allMyState);
        }
    }
}

同样的概念可能适用于其他序列化方案,如JSON,XML等。

你需要仔细考虑你在状态对象中放入的内容,因为其中的所有内容都将被保存。

  

c)我是否过分了保存简单程序的复杂性?

不是真的。如果不仅仅是几个值,保存程序状态可能很复杂。

答案 1 :(得分:2)

A)成功编译后,我的IDE是否知道我拥有多少个对象,它们的数据类型以及它们属于哪个类?

加载程序的状态与IDE或编译无关。你启动你的程序并且它已经运行了,你想通过从文件中加载一些状态来改变它的状态。

如果使用序列化,则可能会遇到与版本和类不兼容相关的问题 - 例如如果您决定向类中添加新字段,则需要编写额外的代码以便能够加载没有该字段的旧状态。所以其他格式,如XML,JSON或纯文本(以及自己进行转换)可能是更好的主意。

B)有没有办法保存所有对象而不单独指定它们。

好吧,理论上应该可以保存整个JVM的状态并在以后加载它。这是一个高级主题,因为JVM内部发生了所有聪明的事情(例如Just-In-Time编译器,垃圾收集和各种动态优化),会出现很多问题。我不建议这样下去。最有可能的是,您根本无法更改代码 - 例如如果在GUI中添加新按钮,则加载的版本将不会拥有它,因为它将加载旧版本的类。因此,无法将旧游戏状态加载到游戏的新版本中。

C)我是否过分了保存简单程序的复杂性?

假设您的游戏中包含带有构造函数Game(以及其他一些参数)的Game(String name)类。这是您第一次只需拨打new Game("firstGame")即可创建它。但是现在你想从一些保存状态创建这个对象。您可以序列化对象然后将其加载,结果将是对象本身。或者您可以读取该文件以获取该字符串,并使用此字符串自己调用构造函数。更进一步,有些库可以将对象转换为JSON,将JSON转换为对象(例如Jackson序列化器)。

答案 2 :(得分:0)

有一个可以保存游戏当前状态的课程。

public class Game{
    int coOrdinateX;
    int coOrdinateY;
    int score;
    String[] powersCurrentlyTheUserHad;
    ...
}

当用户退出时,使用相关数据加载此类。一旦游戏终止,内存消失,您需要将其保存在文件中。

序列化是一种将对象存储到磁盘(本质上是文件)的方式,这样,当您使用库函数反序列化时,您可以直接使用当前状态返回对象。

检查  http://www.tutorialspoint.com/java/java_serialization.htm了解更多详情