gpt4 book ai didi

java - 最终 transient 字段的序列化/反序列化

转载 作者:行者123 更新时间:2023-12-04 03:42:19 30 4
gpt4 key购买 nike

this问题说 final transient 字段在序列化后不能设置为任何非默认值。那么,为什么我为 aVar1 变量设置了 3,为 aVar3 变量设置了 s3?

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,一些常量表达式被分配给它们。这些称为编译时间常量。

编译时常量的条件是

  1. 它们必须被声明为最终的
  2. 它们是原始数据类型或String
  3. 它们必须通过声明进行初始化。
  4. 它们的值必须是常量表达式。

编译时间常量重新受到影响,这些值将在反序列化后保留。

关于java - 最终 transient 字段的序列化/反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65768419/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com