gpt4 book ai didi

java - 跨不同 JVM 的 Java 标准库中的 SerialVersionUID

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:55:22 26 4
gpt4 key购买 nike

基于此处SerialVersionUID的描述:https://docs.oracle.com/javase/8/docs/platform/serialization/spec/class.html#a4100 ,似乎有必要始终在您创建的任何类中包含 SerialVersionUID,以便用于序列化的 JVM 和用于反序列化的不同 JVM 不会自动分配它们自己的 SerialVersionUID,由于虚拟机。这对于控制我自己的类的反序列化非常有效,但是如果我想确保标准库中使用 JVM A 序列化的类可以被 JVM B 反序列化怎么办?

Map<Integer, String> myMap = new HashMap<>();

HashMap 定义了一个 SerialVersionUID。但是:

  • 由于 HashMap 存在于 java 标准库中,我是否提供任何形式的保证,如果我使用 JVM A 序列化此 HashMap,那么 JVM B 将能够反序列化它?即,是否允许 JVM B 指定与 JVM A 不同的 SerialVersionUID,至少如果 B 只是 A 的次要版本升级?
  • 如果不能保证标准库类,那么使用 SerialVersionUID 是否真的可以确保对您自己的类进行正确的反序列化,而这些类从不接触 java 标准库?例如,一个看起来像这样的类:

    public class NewClass implements Serializable
    {
    private static final long serialVersionUID = 1L;

    private final Map<Integer, String> myMap;

    public NewClass()
    {
    this.myMap = new HashMap<>();
    }
    }

    很容易失败,因为反序列化依赖于具有相同 SerialVersionUID 的 HashMap,这在不同的 JVM 中可能不同,对吗?

最佳答案

可能 是的,你是对的。

实际上这在不久前发生在我们的一些 swing 类中(我真的不记得具体是哪个),但是在 jdkX 上序列化并反序列化它们在 jdkX+1 上(那是很久以前的事了,很抱歉错过了这些细节),事情开始因 InvalidClassException 而中断。我们当时支付了支持并提出了一个问题 - 回应是,这些类的更改方式使得无法正确反序列化它们 - 你被这个版本卡住了,或者升级到jdk+1 并使用它。从那以后,我再也没有发生过这种事,一次也没有。

我认为,一般来说,这也是使序列化变得困难的原因。您必须维护这样一个过程,以便从序列化的角度来看, future 版本中的更改可以与以前的版本相关并兼容。

另一方面,HashMap 有一种非常聪明的方法来序列化它的数据。它序列化(除其他事项外,例如 load_factor 等)它是键和值 - 没有别的。因此,无论实现是否发生变化,它们都可能被反序列化。出于这个原因,一些不需要的字段被标记为临时的,例如:

 transient int modCount;
transient Set<Map.Entry<K,V>> entrySet;

这个想法是它应该序列化数据与结构。


例如,如果 HashMap 以序列化会在 jdk-11 中中断的方式更改,这会让很多开发人员生气,我怀疑这是否会发生采取的路径(除非真的需要)

关于java - 跨不同 JVM 的 Java 标准库中的 SerialVersionUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49056971/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com