2013-02-28 61 views
3
System.out.println("Hello brave souls!"); 

我有几个关于对象序列化的问题。我正在研究我的数学游戏的新版本,并且忘记在最近三次会话中保存游戏模式。记录正在通过对象序列化来保存,这导致我在这里。我想知道的是:对象序列化的魔法精灵

1.)对象序列化是否保持对象保存到文件的时间? 2.)在更改文件中的n个对象中的任意一个时,是否必须将要更改的对象加载到内存中(通过循环遍历对象),更改它,然后将每个最后的对象重新写回到文件? //似乎很单调

+1

我喜欢,尽管我自己。你得到一个+1。 – Perception 2013-02-28 00:42:59

+0

序列化与持久性不一样。数据库将是更好的选择。 – whatnick 2013-02-28 01:45:11

回答

1

1)不执行对象序列化勉强保持在该对象被保存到文件的时间保持?

不。它保存对象,只保存对象,以及任何需要重新构造的对象,比如它的类名。

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

在不能改变任何文件中的Ñ对象。您必须将文件重建为对象,更改对象并重新进行串行化。

//似乎有些单调乏味

这是乏味的。没人说这不会很乏味。你正在使用它作为数据库。事实并非如此。这是一个序列化,这也意味着它是一个流。完全相同的情况适用于文本文件。

+0

关于对象序列化的另一个观察/问题:我注意到,在将要修改的记录反序列化为.ser文件时,修改需要修改的记录,然后将它们序列化到另一个.ser文件中,新创建的.ser文件是尽管在每个文件中都有相同数量的对象,但它比旧的还要小。有65个对象,我只是修改了其中三个对象的布尔值。任何人都可以解释为什么这可能会发生? //我应该甚至担心任何数据被擦除 – 2013-03-01 01:12:19

+1

@MikeWarren您可能遇到了ObjectOutputStream.reset()'是治愈的问题。您可能已经在每个对象后面写入了具有重置的原始流,而不是以相同的方式写入更新的流。 – EJP 2013-03-01 09:19:55

+0

考虑到我试图制作的程序的性质,旧文件在每个对象后重置。实际上,我创建了一个类来扩展在writeStreamHeader()中调用reset()的ObjectOutputStream。但是,作为一个测试,我尝试使用如下对象复制这个对象序列化文件: for(int x = 0; x )olddata.readObject(); \t newdata.writeObject(记录);!\t //并将其写入新文件 } ,结果是一场灾难 – 2013-03-03 11:38:20

3

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

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

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

如果你正在处理真正大的对象,嵌入式数据库可能是一个更好的选择,因为你可以改变一个字段而不需要把整个东西加载到RAM中。最后,如果要在对象序列化时更新对象的时间戳,请在Serializable伪接口中实现writeObject方法。更新您的时间戳,然后在提供的ObjectOutputStream上调用defaultWriteObject。这会给你'最后坚持'的行为。

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

这个问题需要解决,理由是我必须修改一些数据以确保它在正确的位置。另外,我计划添加日历功能。所以,我正在寻找一种方法来保存时间戳。我正在考虑做类似声明一个文件输出流,一个文件输入流,一个对象输出流和一个对象输入流,将输入流设置为当前文件中的东西,然后将数据“转储”到文件由输出流提供。 时间戳会是你明确必须保存的东西吗? – 2013-02-28 06:04:00

+0

可能在实例化对象时(在构造函数中)而不是在序列化时创建时间戳。 – 2013-03-01 23:44:42