Java transient不被持久化的原因

时间:2022-07-23
本文章向大家介绍Java transient不被持久化的原因,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

网上大多都是对transient使用的介绍,没有介绍为什么被transient修饰的类成员变量不被序列化,下面将通过源码进行讲解

  • 环境: jdk1.8
  • 核心代码: ObjectStreamClass.java
private static ObjectStreamField[] getDefaultSerialFields(Class<?> cl) {
        Field[] clFields = cl.getDeclaredFields();
        ArrayList<ObjectStreamField> list = new ArrayList<>();
        int mask = Modifier.STATIC | Modifier.TRANSIENT;

        for (int i = 0; i < clFields.length; i++) {
            if ((clFields[i].getModifiers() & mask) == 0) {//重点,忽略掉 static 和 transient 修饰的变量
               list.add(new ObjectStreamField(clFields[i], false, true));
            }
        }
        int size = list.size();
        return (size == 0) ? NO_FIELDS :
            list.toArray(new ObjectStreamField[size]);
    }

重点在 if ((clFields[i].getModifiers() & mask) == 0) ,判断变量类型,将 static 和 transient 修饰的成员变量忽略,在io类writeObject中,遍历成员变量的时候就不会出现相应变量。