gpt4 book ai didi

java - 为什么序列化 Integer 会产生太多开销?

转载 作者:行者123 更新时间:2023-11-30 02:20:26 25 4
gpt4 key购买 nike

我正在研究 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com