我正在研究 Java 中的序列化并编写了非常简单的代码:
public class OutputStreamStub extends OutputStream{
public List<Integer> a = new ArrayList<>();
@Override
public void write(int b) throws IOException {
a.add(b);
}
}
OutputStreamStub stub = new OutputStreamStub();
ous = new ObjectOutputStream(stub); //stub.a contains 4 bytes now
ous.writeObject(new Integer(12342134)); //stub.a contains 81 bytes now
在 4 字节整数之后,我们得到了 81 字节。为什么我们有太多的开销?为什么我们在创建ObjectOutputStream
后写入了4个字节?
最佳答案
我有JDK8,所以当我查看构造函数的源代码时:
public ObjectOutputStream(OutputStream out) throws IOException {
verifySubclass();
bout = new BlockDataOutputStream(out);
handles = new HandleTable(10, (float) 3.00);
subs = new ReplaceTable(10, (float) 3.00);
enableOverride = false;
writeStreamHeader();
bout.setBlockDataMode(true);
if (extendedDebugInfo) {
debugInfoStack = new DebugTraceInfoStack();
} else {
debugInfoStack = null;
}
}
您可以看到,在进行一些验证和初始化之后,writeStreamHeader()
被调用。它的实现如下所示:
protected void writeStreamHeader() throws IOException {
bout.writeShort(STREAM_MAGIC); // STREAM_MAGIC = 0xaced
bout.writeShort(STREAM_VERSION); // STREAM_VERSION = 5
}
这只是附加标题信息。所以我猜测这就是额外 4 个字节的来源。
关于java - 为什么序列化 Integer 会产生太多开销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47014134/