zoukankan      html  css  js  c++  java
  • 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());
    }
    
  • 相关阅读:
    原生内存泄漏检测
    安卓适配
    游戏里的动态阴影-ShadowMap实现原理
    游戏里的跨地图寻路算法
    Unity-Shader-动态阴影(上) 投影的矩阵变换过程
    Unity-奥义技能背景变黑效果
    UGUI学习笔记
    Unity-Shader-镜面高光Phong&BlinnPhong-油腻的师姐在哪里
    Unity-Shader-光照模型之漫反射
    Unity3D-Shader-热扭曲效果
  • 原文地址:https://www.cnblogs.com/qulianqing/p/13290223.html
Copyright © 2011-2022 走看看