我编写了一个小测试程序来显示序列化 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/