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

标签 java serialization deserialization final transient

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/

相关文章:

java - Short 加 Short 是一个 int

java - 设置新的蒙版抓取 JAVA

c++ - shared_ptr 的引入导致反序列化时出现段错误(使用 boost::serialization)

java - Jersey 序列化/反序列化问题 : abstract types can only be instantiated with additional type information

Java 序列化文件未使用 Bukkit 写入

java - Android - 循环多行文本文件并从冒号后的类别中提取数据并将其存储在类变量中

java - .gif 图像在将其添加到 JTabbedpane 时不会移动

c# - 反序列化 JSON Objest 导致所有空字段 C#

java - 序列化覆盖数据

c# - 如何在没有包含元素的情况下序列化 'Any' 元素序列