• 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());
    }
    
  • 相关阅读:
    [转]MTK android 下载及启动过程
    新博客开通~~~
    【代码导读】Github 开源项目——wysihtml5 富编辑器(Bootstrap 风格)【一】
    【代码导读】Github 开源项目——wysihtml5 富编辑器(Bootstrap 风格)【二】
    RHEL6.5 和RHEL7 的区别Rhel6.5实验环境搭建
    RAID的介绍和RAID的安装
    对linux初学者的建议
    linux搭建可用实验环境-rhel7
    Linux下修改Mysql的用户(root)的密码
    confluence的搭建破解安装
  • 原文地址:https://www.cnblogs.com/qulianqing/p/13290223.html
Copyright © 2020-2023  润新知