Java Transient 关键字小记

Transient

今天在看Java的AbstractList的源码,看到了transient关键字,很是好奇。因为在之前从来没有看到了,也没用到过。也没见项目的代码库里有人用。
于是好奇的研究了一下。

引入时间

引入时间是在Java SE 7。
JLS:https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.3.1.3

有什么作用

Variables may be marked transient to indicate that they are not part of the persistent state of an object.

变量可以被标示为transient,标示它不是对象持久化过程中的一部分

怎么用

我有一个类

class UserInfo implements Serializable {

/   // 这个字段标示为transient
    private transient int age;
    private String name;
    

    public UserInfo(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // getter 和setter
    // ....
}

搞个测试

@Test
void serializableTest() {
    final UserInfo test = new UserInfo("lisi", 23);
    assertEquals("lisi", test.getName());
    // 这里age是23
    assertEquals(23, test.getAge());
    writeObjectToFile(test);
    UserInfo o = null;
    o = readToObject(o);
    assertEquals("lisi", o.getName());
    // 这里age是0 也就是int的默认值,包装类型的话是null
    assertEquals(0, o.getAge());
}
// 支撑方法
private void writeObjectToFile(UserInfo test) {
    try {
        ObjectOutputStream outputStream = new ObjectOutputStream(
            new FileOutputStream("./name.txt"));
        outputStream.writeObject(test);
        outputStream.flush();
        outputStream.close();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private UserInfo readToObject(UserInfo o) {
    try {
        ObjectInputStream inputStream = new ObjectInputStream(
            new FileInputStream("./name.txt"));
        o = (UserInfo) inputStream.readObject();
        inputStream.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    return o;
}

有个小坑: User类不能是内部类,一定要是一级类。

spring 的@transient的不同

Java Spring
关键字 注解
序列化时使用到 持久化数据到DB中用到
标记为序列化是忽略掉 标记为持久化是忽略掉

能在fasterxml.jackson 中生效吗?

答案是

不能的

写个测试验证一下:

@Test
void jacksonTest() throws IOException {
    UserInfo test = new UserInfo("lisi", 23);
    assertEquals("lisi", test.getName());
    assertEquals(23, test.getAge());
    ObjectMapper mapper = new ObjectMapper();
    final String testJson = mapper.writeValueAsString(test);
    final UserInfo newUserInfo = mapper.readValue(testJson, UserInfo.class);
    assertEquals("lisi", newUserInfo.getName());
    assertEquals(23, newUserInfo.getAge());
}
posted @ 2020-07-12 22:02  Bluto  阅读(458)  评论(0编辑  收藏  举报