为什么序列化整数需要这么多(81)个字节?

时间:2014-06-12 07:06:08

标签: java serialization

我写了一个小测试程序来显示序列化Integer对象需要多少字节:

    ByteArrayOutputStream data = new ByteArrayOutputStream();
    try {
        ObjectOutputStream output = new ObjectOutputStream(data);
        output.writeObject(1);
        output.flush();
        System.out.println(data.toByteArray().length);
    } catch (IOException e) {
        e.printStackTrace();
    }

然而,结果令人惊讶,需要81个字节。如果我序列化String“1”,则只需要8个字节。我知道java有String序列化的优化,但为什么不为Integer做同样的事情?我认为这应该不是很困难。

或者有人有一些解决方法吗?我需要一个可以序列化所有包括对象和基本类型的方法。谢谢你的回答!

1 个答案:

答案 0 :(得分:4)

这是一种平衡行为,通过对许多类型提供直接支持,以及在保持简单之间使序列化协议更复杂。

根据我的经验,与Integer值相比,int值相对较少 - 而后者 具有内置支持,以及所有其他基本类型。同样值得注意的是,尽管序列化单个 Integer对象的成本很高,但增量成本要小得多,因为已经有了对该类的引用。流。因此,在编写第一个Integer之后,新的Integer只需要10个字节 - 以及对已经写入流的Integer的引用(如果您使用的话,则会很常见)。重拳击小值)只有5个字节。

就我个人而言,我会尽量避免本机Java二进制序列化 - 它是特定于平台的,并且非常脆弱,并且不是非常紧凑。我喜欢Protocol Buffers,但也有很多其他选择。