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

标签 java serialization

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

相关文章:

java - 如何创建一个使用线程从下限到上限计数的程序?

c# - unattend.xml 架构的位置

java - 如何使用 ArrayList<Parcelable> 正确实现 Parcelable?

java - 如果我的对象是可序列化的,我可以发送对象的 ArrayList<> 吗?

serialization - F#、Json.NET 6.0 和 Web Api - 记录类型的序列化

android - 在android中将对象从一个应用程序传递到另一个应用程序

java - 使用 Java Swing 绘制多条线

Java如何使用类对象进行List初始化

用于选择和比较卡片的 Java 代码(没有 Arraylist)

java - 寻找开源 Java Help API