java - writeObject() 如何访问 serialPersistantFields

标签 java

需要序列化,我理解这一点,但是 stream.defaultWriteObject() 如何实际访问它们,因为它们是私有(private)的、静态的和最终的。

我的 CS 讲师无法解释这一点(或者他只是不想解释),而且(据我所知)也没有任何文档可以解释这种机制。

即使是抽象的解释也是非常受欢迎的!

最佳答案

我们通常采用的获取私有(private)字段的方式:反射。具体通过Field.setAccessible(true)。这是他们执行此操作的代码,来自 java.io.ObjectStreamClass,Java 8:

/**
 * Returns serializable fields of given class as defined explicitly by a
 * "serialPersistentFields" field, or null if no appropriate
 * "serialPersistentFields" field is defined.  Serializable fields backed
 * by an actual field of the class are represented by ObjectStreamFields
 * with corresponding non-null Field objects.  For compatibility with past
 * releases, a "serialPersistentFields" field with a null value is
 * considered equivalent to not declaring "serialPersistentFields".  Throws
 * InvalidClassException if the declared serializable fields are
 * invalid--e.g., if multiple fields share the same name.
 */
private static ObjectStreamField[] getDeclaredSerialFields(Class<?> cl)
    throws InvalidClassException
{
    ObjectStreamField[] serialPersistentFields = null;
    try {
        Field f = cl.getDeclaredField("serialPersistentFields");
        int mask = Modifier.PRIVATE | Modifier.STATIC | Modifier.FINAL;
        if ((f.getModifiers() & mask) == mask) {
            f.setAccessible(true);
            serialPersistentFields = (ObjectStreamField[]) f.get(null);
        }
    } catch (Exception ex) {
    }

关于java - writeObject() 如何访问 serialPersistantFields,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44252709/

相关文章:

java - El Capitan 让我的 JVM 高不可攀

java - 将当前类的对象传递给另一个类

immutability - 不可变 JDK 类的完整列表?

java - JSF:空嵌套数据表

java.util.regex.PatternSyntaxException : Illegal repetition near index 12

java - Java 中的死代码错误

java - EJB 将所有异常包装成 EJBException

java - 使用我自己在 OpenCV 中的公式将 RGB 转换为灰度

java - 如何使用retrofit2查找 map 中的标记?

java - 如何解决在另一个 Activity 中搜索标题打不开实际描述的问题?