java - 为什么序列化 Integer 需要这么多(81)个字节?

标签 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对字符串序列化有优化,但为什么不对整数做同样的事情呢?我想应该不会很难。

或者有人有解决办法吗?我需要一种可以序列化所有内容(包括对象和基本类型)的方法。感谢您的回答!

最佳答案

这是一种平衡行为,既要通过直接支持多种类型来使序列化协议(protocol)变得更加复杂,又要保持简单。

根据我的经验,与 int 值相比,Integer 值相对较少 - 后者确实具有内置支持,以及所有其他原始类型。还值得注意的是,尽管序列化单个Integer对象的成本很高,但增量成本要小得多,因为流中已经存在对该类的引用。因此,在写入第一个 Integer 后,新的 Integer 仅占用 10 个字节 - 以及对已写入的 Integer 的引用流(如果您要装箱小值,则很常见)只有 5 个字节。

就我个人而言,无论如何,我都会尽量避免原生 Java 二进制序列化 - 它是特定于平台的并且非常脆弱,而且不是非常紧凑。我喜欢Protocol Buffers但还有很多其他替代方案可用。

关于java - 为什么序列化 Integer 需要这么多(81)个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24178383/

相关文章:

java - 我应该链接 GUI 测试还是每次都重新启动小程序?

java - 我如何格式化 java.time.Duration mm :ss

未找到 javax.servlet 包

c# - 使用 JSON.NET 进行序列化时,使自定义 JsonConverter 尊重 ItemTypeNameHandling

php - Swift、php 和 unicode 字符

带有序列化对象的 java.io.StreamCorruptedException

java - 寻找 Amazon DynamoDB java 库

java - 用单元格内容替换字符串单元格引用

rest - 在使用 FOSRestBundle 进行序列化期间检测到 Symfony 3.0.4 循环引用

jquery - 如何在 jQuery 中序列化数组复选框