【问题标题】:The Magic Fairies of Object Serialization对象序列化的魔法精灵
【发布时间】:2013-02-28 00:33:11
【问题描述】:
System.out.println("Hello brave souls!");

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

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

【问题讨论】:

  • 我笑了,尽管我自己。你会因此获得 +1。
  • 序列化不等同于持久化。数据库会是更好的选择。

标签: java file object serialization time


【解决方案1】:

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

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

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

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

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

private void writeObject(java.io.ObjectOutputStream out) throws IOException

【讨论】:

  • 这个问题需要解决,因为我必须修改一些数据以确保它在正确的地方计数。另外,我计划添加一个日历功能。所以,我正在寻找一种方法来保存时间戳。我正在考虑做一些事情,比如声明一个文件输出流、一个文件输入流、一个对象输出流和一个对象输入流,将输入流设置为文件中当前的内容,然后将数据“转储”到输出流提供的文件。时间戳是您必须明确保存的东西吗?
  • 可能在实例化对象时(在构造函数中)创建时间戳,而不是在序列化时。
【解决方案2】:

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

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

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

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

// 看起来很乏味

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

【讨论】:

  • 关于对象序列化的另一个观察/问题:我注意到,在使用要修改的记录反序列化 .ser 文件时,修改需要修改的记录,然后将它们序列化到另一个 .ser 文件中,即使每个文件中的对象数量相同,新创建的 .ser 文件也比旧文件小得多!有 65 个对象,我只是修改了其中三个对象的布尔值。谁能解释为什么会发生这种情况? //我什至应该担心任何数据被删除
  • @MikeWarren 您可能遇到了ObjectOutputStream.reset() 可以解决的问题。您可能已经在每个对象之后编写了带有重置的原始流,而不是以相同的方式编写更新的流。
  • 鉴于我正在尝试制作的程序的性质,旧文件在每个对象之后都会重置。事实上,我创建了一个类来扩展在 writeStreamHeader() 中调用 reset() 的 ObjectOutputStream。但是,作为测试,我尝试使用以下方式逐个对象复制此对象序列化文件: for (int x = 0; x )olddata.readObject(); newdata.writeObject(record); //并写入新文件 } 结果是灾难!
  • 请原谅,因为我尝试通过仅缩进四个空格来识别我的代码,但没有成功。
  • 我修好了。这里的问题是当x > 0时我没有打电话给newdata.reset();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-16
  • 1970-01-01
  • 2018-03-08
相关资源
最近更新 更多