我正在使用一些静态方法和字段来进行保存状态序列化。但我记得,序列化和静态可能会引起混乱。我是否应该将所有的静态变量都设为瞬态?如果反序列化调用inflate()函数,那么静态变量是否能够正常恢复?
我正在使用一些静态方法和字段来进行保存状态序列化。但我记得,序列化和静态可能会引起混乱。我是否应该将所有的静态变量都设为瞬态?如果反序列化调用inflate()函数,那么静态变量是否能够正常恢复?
static
是隐式的transient
,因此您不需要将它们声明为这样。
序列化是用于序列化实例,而不是类。 static
字段(由于它们是类定义的一部分,因此方法并不重要,所以它们不会被序列化)将在加载类时重新初始化为其设置的任何值。
如果您有一个可变的static
字段,则对该值进行的更改将丢失。
以下是简短的规则:
1. 在序列化过程中,static
变量不会被保存。反之,在反序列化过程中,static
变量会从类级别初始化开始。
2. 带有static
和transient
关键字的变量在序列化时都会被忽略。
3. 类名和serialVersionUID
都将作为字节流进行序列化,当反序列化时,从源头读取的serialVersionUID
会与本地类的相同static
变量进行比较。这就是为什么要将serialVersionUID
声明为static public final
,以便无需创建进一步的对象来比较这些版本UID。
static
字段在序列化时会被忽略。
我更新了原始意图,将transient
更正为static
...
static
字段不会被序列化。
静态属于类,序列化处理对象/实例。
因此,声明为静态后,它不再属于对象,无法进行序列化。
静态字段永远不能成为“ser”文件的一部分。静态+瞬态与瞬态相同。