当前位置: 首页 > 面试题库 >

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

姜煌
2023-03-14
问题内容

我偶然了解了Java序列化。我读过许多文档和书籍,其中静态变量和瞬态变量无法在Java中序列化。我们声明一个serialVersionUid如下。

private static final long serialVersionUID = 1L;

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

java.io.InvalidClassException

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

据我所知,我认为如果静态变量不能序列化。毫无例外。我可能仍在学习,所以可能是错的。

“无法序列化Java中的静态变量和瞬态变量”是一个神话。请纠正我,我对这个概念一团糟。


问题答案:

serialVersionUID是序列化和反序列化过程使用的 特殊
静态变量,用于验证本地类与用于序列化对象的类兼容。它不仅是静态变量,而且不像其他静态变量那样必须序列化。

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



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

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

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

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

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

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