【问题标题】:Is the serialization of Guava immutable collections stable?Guava 不可变集合的序列化是否稳定?
【发布时间】:2011-11-29 16:37:48
【问题描述】:

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

【问题讨论】:

  • 这可能是任何类的问题 - 您希望发送方和接收方的库版本相同。

标签: java serialization guava


【解决方案1】:

让我们给出一些观点。

序列化最突出的用途是:

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

如果您控制在客户端和服务器上使用哪个 Guava 版本,Guava 完全适用于应用程序 2。此外,虽然 Guava 不保证 Guava 版本之间序列化的一致性……实际上,序列化的形式不会经常变化。

另一方面,让我谈谈为什么 Guava 不保证序列化表单的一致性。我在 Guava 版本 9 和 10 之间更改了 ImmutableMultiset 的序列化形式,原因是我需要重构一些东西,以便可以将 ImmutableSortedMultiset 添加到不可变集合中。您可以自己查看更改here。尝试在保持序列化表单一致的同时进行相同的重构几乎肯定需要额外的笨拙的黑客攻击,这……非常反对 Guava 团队的哲学。 (这可能由比我更专业的程序员来完成,但我仍然认为这不是微不足道的。)如above linked mailing list thread 中所讨论的那样,长期保证序列化兼容性将需要大量的努力,凯文表示:

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

和贾里德:

根本问题仍然存在:确保序列化的表单 在所有 Guava 版本之间兼容。那是我的目标 朝着 Google Collections 1.0 努力,但后来我放弃了这个目标 意识到它的困难。实现和测试跨版本 兼容性不值得努力。

最后,我要指出的是,Guava 在 Google 内部得到了广泛使用,并且管理得很好。

【讨论】:

    【解决方案2】:

    是的,这是一个合理的担忧。

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

    所有对象的序列化形式可能会发生变化。不要保留这些并假设它们可以被库的未来版本读取。

    如果你使用 Java 原生序列化 Guava 不是一个好的选择。

    【讨论】:

    • 如果无法控制通信两端使用哪个版本,那只是“不是一个好选择”。
    • 这太糟糕了。不可变集合现在应该是稳定的。他们为什么要更改序列化表格?
    • 保持不同版本数据结构之间的序列化兼容性真的很难。请参阅此mailing list thread 中稍后的一些消息,了解其中的一些原因。
    猜你喜欢
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多