Java 中的对象序列化和随机访问



您可以将Java的内置对象序列化与随机访问文件一起使用吗?我的动机是我对这个问题的回答。

可以将序列化与随机访问文件一起使用,但必须自己构建基础结构。如果不实际序列化,就无法获取序列化的大小。

我假设你想在同一文件中存储多个序列化对象,所以你需要做这样的事情:

  1. 存储序列化的对象,跟踪流中的偏移量直到结束,然后在文件末尾写入目录。这类似于 zip 文件格式。

-或-

    为大小写入"占位符"字节,
  1. 然后将对象序列化为流,然后查找回占位符并写入实际写入的字节数。

你可以(使用java的ByteArrayOutputStream和ByteArrayInputStream),但这是一个非常糟糕的主意。Java的内置对象序列化不是无记忆的。"必须从相应的 ObjectInputstream 中读回对象,其类型和顺序与写入时相同。您可以通过为您写入/读取的每个对象创建一个新的 ObjectOutputStream/ObjectInputStream 实例来解决此问题,但这会使您的文件过大。

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
class Test {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
        objectOutputStream.writeObject(1);
        System.out.println(byteArrayOutputStream.size());
        byteArrayOutputStream.reset();
        objectOutputStream.writeObject(2);
        System.out.println(byteArrayOutputStream.size());
        byteArrayOutputStream.reset();
        objectOutputStream.writeObject(2);
        System.out.println(byteArrayOutputStream.size());
        byteArrayOutputStream.reset();
        objectOutputStream.writeObject(3);
        System.out.println(byteArrayOutputStream.size());
        byteArrayOutputStream.reset();
        objectOutputStream.close();
    }
}

输出

  • 81
  • 10
  • 5
  • 10

最新更新