【问题标题】:Java Deep Copy without Serialization无序列化的 Java 深拷贝
【发布时间】:2011-09-01 20:37:42
【问题描述】:

我一直在为 Android 编写一个纸牌游戏,我正拼命想如何保存我的游戏状态。为了简要解释我的程序,我有一个用于显示我的卡片的 Sprite 类,它包含一个位图图像、一个位置点和一个边界矩形。我继承了这个类来创建一个卡片类,它有两个位图,根据卡片是面朝上还是向下切换,以及用于存储花色和等级的枚举。这些卡片对象放置在 CardStack 对象中,其中包含附加位置和卡片数组列表。游戏模型由各种 CardStacks 以及在堆叠之间移动卡片的规则组成。游戏运行良好。

现在我想弄清楚如何保存我的游戏状态。我想序列化我的整个游戏对象并将其保存到文件中。但是,有许多不可序列化的对象(位图、点、矩形、颜色等)。在 C# 中,我知道您可以使用 MemoryStream 并复制整个对象,但我在 Java 中找不到不需要所有内容都可序列化的类似方法。 Java中有类似的东西吗?有什么更好的方法可以构建我的游戏模型对象吗?任何建议将不胜感激。谢谢!

【问题讨论】:

  • 您不需要保存位图和矩形等内容。保存堆栈的位置以及位置和其中卡片的枚举应该足以恢复状态并且还可以节省内存。
  • 在不知道游戏是如何进行的情况下,我不知道您必须保存哪些信息。但是,如果我想象的方式是正确的,您是否只需将每张卡的值和套件存储在所有堆栈中即可重新创建游戏状态?如果您知道卡片套件和等级,则可以计算出位图和颜色。至于位置(点和矩形)让这些准确重要吗? IE。是否允许用户将卡片/堆栈移动到任何 x/y 位置?还是有允许的“插槽”?如果是后者,您只需要存储卡/堆栈应该在哪个插槽中。

标签: java android serialization clone


【解决方案1】:

将gui抽象成业务对象,让gui对象封装这些业务对象

这样卡片不需要知道它需要显示什么位图(甚至根本不需要显示它)

那些业务对象是您想要序列化的对象,并且可以从反序列化的对象中重建 gui

【讨论】:

    【解决方案2】:

    您始终可以在 Java 的序列化框架中编写自己的自定义序列化方法。见Serializable

    在序列化和反序列化过程中需要特殊处理的类必须实现具有这些确切签名的特殊方法:

    private void writeObject(java.io.ObjectOutputStream out) throws IOException
    private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;
    private void readObjectNoData()  throws ObjectStreamException;
    

    如果您的对象包含不可序列化的对象,Java 的默认实现将失败是正确的,但您可以在上面的方法中定义如何序列化它们。

    另外:在 Android 上,您可能需要使用 Parcelable,它是 Android 的序列化版本。

    【讨论】:

      【解决方案3】:

      看看protocol buffers(protobuf)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-10
        • 1970-01-01
        • 1970-01-01
        • 2012-10-14
        • 2011-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多