有人警告我不要在序列化通信中使用的对象中使用Guava不可变集合,因为如果一端的Guava版本更新了,可能会出现序列化版本不兼容的问题。这是一个合理的担忧吗?
让我们来看一下。
序列化最突出的用途是:
- 在应用程序运行之间存储数据
- 在客户端和服务器之间发送数据
Guava对于应用程序2来说是完全没问题的。此外,虽然Guava不保证Guava版本之间序列化的一致性……实际上,序列化的表单不会经常更改。
另一方面,让我给出一些关于为什么Guava不能保证序列化表单的一致性的观点。在Guava版本9和10之间,我更改了ImmutableMultiset的序列化形式,原因是我需要重构一些东西,以便将immutableortedmultiset添加到不可变集合中。你可以在这里看到变化。试图在保持序列化表单一致性的同时进行相同的重构,几乎肯定会需要额外的尴尬技巧,这是……强烈反对Guava团队的理念。(也许一个比我更专业的程序员也能做到,但我仍然认为这不是微不足道的。)保证长期的序列化兼容性需要付出惊人的努力,正如上面链接的邮件列表线程中所讨论的那样,Kevin说:
试图提供跨版本兼容性使得处理百倍的事情更加困难和困难番石榴还没开始我们就放弃了。
和Jared:
潜在的问题仍然存在:确保序列化的表单在所有Guava版本之间兼容。那是我的目标,当致力于Google Collections 1.0,但后来我放弃了这个目标意识到它的困难。实现和测试跨版本兼容性不值得付出努力。
最后,我要指出Guava在谷歌内部被广泛使用,并且管理得很好。
是的,这是一个有效的关注。
来自Guava项目主页(http://code.google.com/p/guava-libraries/):
)所有对象的序列化形式可能会改变。不要将它们持久化,并假设它们可以被库的未来版本读取。
如果您正在使用Java本机序列化,那么Guava不是一个好的选择。