番石榴不可变集合的序列化是否稳定?

Kev*_*ong 7 java serialization guava

我被警告不要在序列化通信中使用的对象中使用Guava不可变集合,因为如果更新了一端的Guava版本,则可能存在序列化版本不兼容问题.这是一个有效的问题吗?

Lou*_*man 7

让我们来看一些观点.

序列化最突出的用途是:

  1. 在应用程序的运行之间存储数据
  2. 在客户端和服务器之间发送数据

如果您控制在客户端和服务器上使用哪个Guava版本,Guava对于应用程序2来说完全没问题.此外,虽然Guava不保证Guava版本之间序列化的一致性......但实际上,序列化形式并没有经常发生变化.

另一方面,让我给出一些观点,说明为什么Guava不能保证序列化表格的一致性.我在Guava版本9和10之间更改了ImmutableMultiset的序列化形式,之所以是因为我需要重构事物,所以我可以将ImmutableSortedMultiset添加到不可变集合中.你可以在这里看到变化.试图在保持序列化形式一致的同时进行同样的重构几乎肯定需要额外的笨拙黑客攻击,这对于Guava团队的理念非常强烈.(它可能比我自己更专业的程序员可行,但我仍然声称它不会是微不足道的.)保证长期的序列化兼容性需要大量的工作量,如上面链接的邮件列表中所讨论的线程,凯文说:

试图提供跨版本兼容性使得事情变得困难了一百倍,我们在Guava开始之前就放弃了它.

和贾里德:

根本问题仍然存在:确保序列化表单在所有Guava版本之间兼容.在为Google Collections 1.0工作时,这是我的目标,但在意识到它的难度后我放弃了这个目标.实现和测试跨版本兼容性并不值得.

最后,我会指出Guava在整个地方都在Google内部使用并且管理得非常好.


Mik*_*eck 5

是的,这是一个有效的问题.

来自Guava项目主页(http://code.google.com/p/guava-libraries/):

ALL对象的序列化形式可能会发生变化.不要坚持这些并假设它们可以被未来版本的库读取.

如果您使用的是Java本机序列化,那么Guava不是一个好选择.

  • 如果您无法控制通信两端使用的版本,那么这只是"不是一个好选择". (2认同)