跳过Java序列化的适当Java关键字是什么?

3
在学习Java序列化概念的过程中,我在一个地方感到困惑。在Java序列化过程中,我们使用2个关键字来防止序列化,即transient和static。如果我不想保存实例变量,应该使用哪个关键字?这两个关键字的作用是相同的。
Class A implements Serializable{
  private static int x;
  private transient int y;
  private transient static int x;
}

在上面的代码中,所有三个实例变量在序列化过程中都没有被保存。有哪个关键字是适合和推荐用于防止序列化的?为什么这两个关键字几乎具有相同的功能?防止序列化的建议声明方式是什么?如果我有错误,请纠正我,因为我还在学习中。
4个回答

12
static关键字将实例变量转换为静态变量。一个副作用是该字段不再被序列化了...因为它不再是一个字段了。
静态变量是类的变量。实例变量是对象或类实例的变量。你不能盲目地从一个变量类型转换为另一个。
阅读有关实例和静态变量的教程页面
当然,transient关键字才是正确的关键字。

4
你可能会感到困惑:static字段并不是实例变量,它们是类范围内的变量。通过声明一个static字段,相同的字段将在该类的所有实例之间共享 - 它不再是任何特定对象的一部分,这导致它无法被序列化。
要特别防止序列化,只有transient是适用的...

有没有关键字或注释可以确保字段可以被持久化但不可序列化? - humbleCodes

2

Transient (以及在JAXB XmlTransient中) 表示数据是短暂的,不具有永久的重要性,因此在持久化方面应该被忽略。

Static表示该值适用于类级别,因此对于多个实例进行序列化/反序列化将是不安全的,因为值会发生冲突。


1

好的,让我再次定义序列化。

A serialization is a process in which we persist state of an object.

那么,任何静态变量都是对象状态的一部分吗?绝对不是。它是在类的所有对象之间共享的数据。因此,任何静态变量都不应该与对象状态一起序列化。

假设我们允许持久化对象的状态。如果这个变量被其他对象/类本身更改,并且我们尝试反序列化对象,那么这个静态变量将会保留什么值。这将导致冲突。

因此,如果您想防止任何实例变量被序列化,请使用transient。当您反序列化对象时,它将被初始化为默认值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接