In this https://stackoverflow.com/questions/2968876/final-transient-fields-and-serialization问题说final
transient
序列化后字段不能设置为任何非默认值。那么为什么我有 3 个aVar1
变量和 s3 为aVar3
多变的?
import java.io.*;
import java.util.*;
class Test
{
public static void main(String[] args) throws IOException, ClassNotFoundException
{
A a1 = new A();
// save a1 to file
FileOutputStream fileOutput = new FileOutputStream("a.dat");
ObjectOutputStream outputStream = new ObjectOutputStream(fileOutput);
outputStream.writeObject(a1);
fileOutput.close();
outputStream.close();
// load a1 from file
FileInputStream fiStream = new FileInputStream("a.dat");
ObjectInputStream objectStream = new ObjectInputStream(fiStream);
a1 = (A) objectStream.readObject();
fiStream.close();
objectStream.close();
// fields after deserialization
System.out.println(a1.aVar1); // 3
System.out.println(a1.aVar2); // null
System.out.println(a1.aVar3); // s3
System.out.println(a1.aVar4); // null
}
}
class A implements Serializable
{
public final transient int aVar1 = 3;
public final transient Map <Object, Object> aVar2 = new HashMap <> ();
public final transient String aVar3 = "s3";
public final transient String aVar4 = new String("s4");
}
反序列化期间,不会调用对象的构造函数。这是由 JVM 处理的特殊对象实例化过程。
对于aVar2和aVar4,调用Hashmap和字符串构造函数。所以这些变量被分配了默认值(null)。
对于aVar1和aVar3,一些常量表达式被分配给它们。这些称为编译时常数。
编译时间常数的条件是
- 它们必须被宣布为最终的
- 它们是原始数据类型或字符串
- 它们必须用它们的声明来初始化。
- 它们的值必须是常量表达式。
编译时间常数会受到影响,这些值将在反序列化后保留。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)