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());
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号