java - 原始类型的 transient final 和 transient final 包装类型之间的区别

标签 java

transient final inttransient final Integer 有什么不同。

使用 int:

transient final int a = 10;

序列化前:

a = 10

序列化后:

a = 10

使用整数:

transient final Integer a = 10;

序列化前:

a = 10

序列化后:

a = null

完整代码:

public class App implements Serializable {
    transient final Integer transientFinal = 10;

    public static void main(String[] args) {
    try {
        ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream(
                "logInfo.out"));
        App a = new App();
        System.out.println("Before Serialization ...");
        System.out.println("transientFinalString = " + a.transientFinal);
        o.writeObject(a);
        o.close();
    } catch (Exception e) {
        // deal with exception
        e.printStackTrace();
    }

    try {

        ObjectInputStream in = new ObjectInputStream(new FileInputStream(
                "logInfo.out"));
        App x = (App) in.readObject();
        System.out.println("After Serialization ...");
        System.out.println("transientFinalString = " + x.transientFinal);
    } catch (Exception e) {
        // deal with exception
                    e.printStackTrace();
    }
}

最佳答案

如文章所述

http://www.xyzws.com/Javafaq/can-transient-variables-be-declared-as-final-or-static/0

使字段成为 transient 将阻止其序列化,但有一个异常(exception):

There is just one exception to this rule, and it is when the transient final field member is initialized to a constant expression as those defined in the JLS 15.28. Hence, field members declared this way would hold their constant value expression even after deserializing the object.

如果你访问提到的 JSL 你就会知道

A constant expression is an expression denoting a value of primitive type or a String

但是 Integer 不是原始类型,也不是 String 所以它不被认为是常量表达式的候选者,所以它的值在序列化后不会保留。

演示:

class SomeClass implements Serializable {
    public transient final int a = 10;
    public transient final Integer b = 10;
    public transient final String c = "foo";

    public static void main(String[] args) throws Exception {

        SomeClass sc = new SomeClass();
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(sc);

        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(
                bos.toByteArray()));
        SomeClass sc2 = (SomeClass) ois.readObject();

        System.out.println(sc2.a);
        System.out.println(sc2.b);
        System.out.println(sc2.c);
    }
}

输出:

10
null
foo

关于java - 原始类型的 transient final 和 transient final 包装类型之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25304468/

相关文章:

java - 删除实体会自动更新它们的关系吗?

java - JAXB 将空字符串全局编码为空

java - 将 list.map 返回类型从列表更改为 JsonArray

java - 使用 Keycloak 保护的 REST API 作为 OAUTH2-Provider 的代理

java - 为什么非静态最终成员变量不需要遵循常量命名约定?

java - 使用自己的 Java 代码在 WEKA 中获取风险预测

java - 我的循环中将字符解析为 ascii 与比较我已经设置的分配值之间是否存在问题?

java - 是否有与 FontUtilities.getCompositeFontUIResource(Font) 等效的非专有等效项?

java - 具有重复语句的 Servlet Controller

java - Android 每 1 秒存储一次相机预览