3
System.out.println("Hello brave souls!");

我有几个关于对象序列化的问题。我正在开发我的数学游戏的新版本,但忘记让它在最后三个会话中保存游戏模式。记录是通过对象序列化保存的,这将我引到这里。我想知道的是:

1.) 对象序列化是否以某种方式保持对象保存到文件的时间?2.)在更改文件中的任何 n 个对象时,您是否必须将要更改的对象加载到内存中(通过循环遍历对象),更改它,然后将每个最后的 FREAKING OBJECT 重写回文件?//看起来很乏味

4

2 回答 2

3

序列化序列化整个对象图。如果您正在保存游戏,您可能需要调用 ObjectOutputStream.writeObject(myGame),它将递归地写入整个游戏对象及其引用的所有非瞬态属性。

要更改它,请使用 ObjectInputStream 将游戏加载到内存中,更改一个值,然后将其写回。

如果您正在处理大量数据,您可能还希望链接 GZIPInputStream 和 GZIPOutputStream,它可以很好地缩小序列化大小。

如果您正在处理非常大的对象,嵌入式数据库可能是更好的选择,因为您可以更改单个字段而无需将整个对象加载到 RAM 中。

最后,如果您想在对象被序列化时更新其时间戳,请在 Serializable 伪接口中实现 writeObject 方法。更新您的时间戳,然后在提供的 ObjectOutputStream 上调用 defaultWriteObject。这会给你“最后坚持”的行为。

private void writeObject(java.io.ObjectOutputStream out) throws IOException
于 2013-02-28T00:55:44.933 回答
1

1.) 对象序列化是否以某种方式保持对象保存到文件的时间?

不,它只保存对象,并且只保存对象,加上重构它所需的任何内容,例如它的类名。

2.) 在更改文件中的 n 个对象中的任何一个

您不能更改文件中的任何N个对象。您必须将文件重组为对象、更改对象并重新序列化。

// 看起来很乏味

这很乏味。没有人说这不会乏味。您将其用作数据库。它不是。它是一个序列化,这也意味着它是一个流。这同样适用于文本文件。

于 2013-02-28T01:28:59.040 回答