没有序列化的Java Deep Copy

时间:2011-09-01 20:37:42

标签: java android serialization clone

我一直在为Android编写一款纸牌游戏,我拼命想如何保存我的游戏状态。为了简要解释我的程序,我有一个用于显示我的卡片的Sprite类,其中包含位图图像,位置点和边界矩形。我继承了这个类来制作一个卡片类,它有两个位图,根据卡片是面朝上还是朝下而切换,以及用于存储套装和等级的枚举。这些卡片对象放置在CardStack对象中,其中包含和附加位置,以及卡片的arraylist。游戏模型包括各种CardStack,以及堆栈之间移动卡的规则。游戏效果很好。

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

4 个答案:

答案 0 :(得分:4)

将gui抽象为业务对象,并使gui对象封装这些业务对象

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

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

答案 1 :(得分:1)

您始终可以在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的序列化版本。

答案 2 :(得分:0)

看看protocol buffers(protobuf)

答案 3 :(得分:0)

尝试深层克隆jar,它可以帮助深层克隆对象,而无需对要克隆的类进行任何其他更改。 refer this