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

时间:2014-12-12 02:33:57

标签: java serialization random-access

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

2 个答案:

答案 0 :(得分:2)

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

我假设您要在同一个文件中存储多个序列化对象,因此您需要执行以下操作:

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

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

答案 1 :(得分:-1)

你可以(使用java的ByteArrayOutputStreamByteArrayInputStream),但这是一个非常糟糕的主意。 Java的内置对象序列化不是无记忆的。 "The objects must be read back from the corresponding ObjectInputstream with the same types and in the same order as they were written."你可以通过为你编写/读取的每个对象创建一个新的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