【问题标题】:While Serializing a java object to a file is it possible to insert an object at the beginning of the serialized file虽然将 java 对象序列化为文件,但可以在序列化文件的开头插入对象
【发布时间】:2013-10-01 07:43:07
【问题描述】:

我正在尝试将 N 个对象序列化到一个文件中。每当我序列化一个对象列表时,我都会在将要序列化为 int 的对象上写下数字,然后再序列化对象。在反序列化时,我首先读取 int 值,然后我将获得必须调用 ObjectInputStream.readObject() 的次数。

但在这种情况下,N 的值只有在运行时才知道。

FileOutputStream fout = new FileOutputStream("c:\\testfile");
ObjectOutputStream oos = new ObjectOutputStream(fout);

oos.writeInt(/* number of objects here */); <- Can't do as the total is unknown till 
                                               last object is encountered

/* done N-times
 oos.writeObject(eachString);
*/

oos.close();
fout.close();

我试过了,还是不行

RandomAccessFile f = new RandomAccessFile("c:\\testfile", "rw");
f.seek(0); // to the beginning
f.writeInt(s.size());
f.close();

Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: 00000003
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:801)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:298)
at testPack.testSerialization.main(testSerialization.java:44)

我已经解决了这个问题

Java Serialization

我不想将 N-Objects 写成一个列表,因为这需要我将完整的列表保存到内存中。

所以,我想知道是否有另一种方法会涉及更改序列化文件的内容(在顶部某处插入 int 值)。

【问题讨论】:

  • readObject 会在没有要读取的对象时抛出异常... 为什么不直接读取直到抛出异常并捕获它
  • 我同意,我们可以捕获 EOFException。这是我暂时要采用的方法。但是,我仍然很好奇它是否也可以通过其他方式完成。
  • Klas 的方法显示了一些希望......你确定它不会起作用吗?
  • @Thihara 它甚至无法编译。
  • @EJP 他的一般想法我的意思是,我没有尝试代码......

标签: java serialization


【解决方案1】:

您是否想过将对象放在 ArrayList 中并对 ArrayList 本身进行序列化/反序列化?

ArrayList implements Serialisable...

【讨论】:

  • 是的,但这样做需要我将整个 ArrayList 保存在内存中,而我根本不想这样做。我要写的对象数量可能很多。
  • 您只能为序列化创建数组。如果它们已经在内存中,那么将它们放在 ArrayList 中不会有太大变化(它只保存指针)。另一种选择是将它们分别保存在不同的文件中。我不建议尝试保存一个容器并直接从文件中提取一个对象
  • 对象从文件中到达并在经过一些处理后写入。在任何给定时间,我只在内存中保存 1 或 2 个对象。
猜你喜欢
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 2016-04-29
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多