是否在序列化过程中序列化了静态变量

srk*_*srk 36 java

我偶然发现了java序列化.我在许多文档和书中都读到静态和瞬态变量无法用Java序列化.我们声明serialVersionUid如下.

private static final long serialVersionUID = 1L;
Run Code Online (Sandbox Code Playgroud)

如果静态变量未被序列化,那么在反序列化过程中我们经常会遇到异常.

java.io.InvalidClassException
Run Code Online (Sandbox Code Playgroud)

其中提取了反序列化对象的serialVersionUID,并与加载的类的serialVersionUID进行比较.

据我所知,我认为如果静态变量无法序列化.这个例外毫无意义.我可能错了,因为我还在学习.

是否存在"java中的静态和瞬态变量无法序列化"的神话.请纠正我,我对这个概念一团糟.

Sat*_*tya 60

  1. 实例变量:这些变量是序列化的,因此在反序列化期间,我们将返回序列化状态.

  2. 静态变量:这些变量未被序列化,因此在反序列化期间,静态变量值将从类中加载.(将加载当前值.)

  3. 短暂的变量: transient变量是不会被序列化,所以反序列化过程的变量将与相应的默认值进行初始化(例如:为对象的null,int 0).

  4. 超类变量:如果超类也实现了Serializable接口,那么这些变量将被序列化,否则它将不会序列化超类变量.在反序列化时,JVM将在超类中运行默认构造函数并填充默认值.所有超类都会发生同样的事情.

  • "因此,反序列化时,静态变量值将从类中加载.(当前值将被加载.)"如果在不同的JVM中对类进行反序列化会怎么样? (3认同)
  • @mdev:正确的陈述是"静态"变量根本不被触及.没有必要说"静态变量值将从类中加载" - 本身. (3认同)

JB *_*zet 48

serialVersionUID是序列化和反序列化过程使用的特殊静态变量,用于验证本地类是否与用于序列化对象的类兼容.它不仅仅是其他的静态变量,它们绝对不是序列化的.

当首先序列化类的对象时,将包含类名和序列版UID的类描述符写入流.当反序列化时,JVM会检查从流中读取的串行版本UID是否与本地类相同.如果它们不是,它甚至不会尝试反序列化对象,因为它知道类是不兼容的.

  • 这很特别,因为序列化机制会查找此静态变量以了解该类的串行版本UID.序列化机制只忽略所有其他静态变量. (4认同)
  • 这意味着它是一个特殊的静态变量.(具体来说,它与序列化中的其他静态变量的处理方式不同.) (2认同)

NPE*_*NPE 5

serialVersionUID是特殊的,不受这些规则的约束。序列化机制中有专门处理该字段以执行自动版本检查的代码。