transient不被持久化的原因

2018-09-02  本文已影响0人  我才是贾福鹏

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

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中,遍历成员变量的时候就不会出现相应变量。

上一篇下一篇

猜你喜欢

热点阅读