我写了一个小测试程序来显示序列化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做同样的事情?我认为这应该不是很困难。
或者有人有一些解决方法吗?我需要一个可以序列化所有包括对象和基本类型的方法。谢谢你的回答!
答案 0 :(得分:4)
这是一种平衡行为,通过对许多类型提供直接支持,以及在保持简单之间使序列化协议更复杂。
根据我的经验,与Integer
值相比,int
值相对较少 - 而后者 具有内置支持,以及所有其他基本类型。同样值得注意的是,尽管序列化单个 Integer
对象的成本很高,但增量成本要小得多,因为已经有了对该类的引用。流。因此,在编写第一个Integer
之后,新的Integer
只需要10个字节 - 以及对已经写入流的Integer
的引用(如果您使用的话,则会很常见)。重拳击小值)只有5个字节。
就我个人而言,我会尽量避免本机Java二进制序列化 - 它是特定于平台的,并且非常脆弱,并且不是非常紧凑。我喜欢Protocol Buffers,但也有很多其他选择。