当前位置: 首页 > 知识库问答 >
问题:

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

谷梁煌
2023-03-14

我无意中理解了java序列化。我在许多文档和书籍中读到静态和瞬态变量不能在Java中序列化。我们声明一个serialVersionUid,如下所示。

private static final long serialVersionUID = 1L;

如果一个静态变量没有序列化,那么在反序列化过程中我们经常会遇到异常。

java.io.InvalidClassException

其中从反序列化对象中提取serialVersionUID并将其与加载类的serialVersionUID进行比较。

据我所知,我认为如果静态变量不能序列化。那例外是没有意义的。我可能错了,因为我还在学习。

“java中的静态和瞬态变量不能序列化”是不是一个神话。请指正,我对这个概念一头雾水。

共有1个答案

羊舌成周
2023-03-14

serialVersionUID是序列化和反序列化过程使用的特殊静态变量,用于验证本地类是否与用于序列化对象的类兼容。它不像其他的那样只是一个静态变量,其他的绝对不是序列化的。

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

 类似资料:
  • 问题内容: 我偶然了解了Java序列化。我读过许多文档和书籍,其中静态变量和瞬态变量无法在Java中序列化。我们声明一个serialVersionUid如下。 如果静态变量未序列化,那么在反序列化过程中我们经常会遇到异常。 其中从反序列化对象中提取serialVersionUID并将其与已加载类的serialVersionUID进行比较。 据我所知,我认为如果静态变量不能序列化。毫无例外。我可能仍

  • 问题内容: 静态变量的值如何在序列化过程中持久化(如果完全持久化)。我在栈上读过类似的问题,它说静态变量本质上是瞬态的,即它们的状态或当前值未序列化。 我只是做一个非常简单的示例,我将一个类序列化并保存到文件中,然后再次从文件中重构该类。令人惊讶的是,我发现静态变量的值在序列化发生时和发生时都被保存了。 这是怎么发生的。这是因为类模板及其实例信息是在序列化期间保存的。这是代码片段- 这是我的主班

  • 问题内容: 我有一个发送到服务器或从服务器发送的用户对象。发送用户对象时,我不想将哈希密码发送给客户端。因此,我添加了password属性,但这也阻止了将其反序列化为密码,这使得在没有密码的情况下很难注册用户。 我怎样才能只应用序列化而不是反序列化?我使用的是Spring JSONView,因此对的控制不多。 我尝试过的事情: 添加到属性 仅添加getter方法 问题答案: 确切的操作方法取决于你

  • 问题内容: 我有一个发送到服务器或从服务器发送的用户对象。发送用户对象时,我不想将哈希密码发送给客户端。因此,我添加了password属性,但这也阻止了将其反序列化为密码,这使得在没有密码的情况下很难注册用户。 我怎样才能只应用序列化而不是反序列化?我使用的是Spring JSONView,因此对的控制不多。 我尝试过的事情: 添加到属性 仅添加getter方法 问题答案: 确切的操作方法取决于你

  • 问题内容: 我正在使用一些静态方法和字段进行保存状态序列化。我可能已经发誓,尽管序列化和static造成了混乱。我应该使所有静电瞬变吗?并扩大通话会恢复正常的静态吗? 问题答案: s是隐式的,因此您不需要这样声明它们。 序列化用于序列化 实例 ,而不是 类 。 字段(方法是不相关的,因为它们是类定义的一部分,所以它们不被序列化)将被重新初始化为加载类时它们设置的任何值。 如果您具有可变字段,则对该

  • 我在序列化和反序列化同一JVM中的对象列表时遇到问题。确切地说,现在我的对象与对象具有相同的引用,它有以下规则: 现在在我的对象列表反序列化之后,在某个时候字母表引用不匹配。我用以下方法检查了一下: 得到了以下结果 现在看看VMId,既然它们是相同的,那么它不应该是相同的对象吗,就像上面的逻辑一样?谢谢你的帮助。