Java 到达serialPersistentFields中声明的静态字段

Java 到达serialPersistentFields中声明的静态字段,java,reflection,xstream,Java,Reflection,Xstream,所以xstream(v1.4.8)使用了这一行 private Object More ...readField(ObjectStreamField field, Class type, Object instance) { try { Field javaField = type.getDeclaredField(field.getName()); 尝试访问名为“list”的字段(field.getName()返回“list”) 在中声明,但遇到NoS

所以xstream(v1.4.8)使用了这一行

private Object More ...readField(ObjectStreamField field, Class type, Object instance) {
        try {
           Field javaField = type.getDeclaredField(field.getName());

尝试访问名为“list”的字段(field.getName()返回“list”)


在中声明,但遇到NoSuchFieldException。这是为什么?

一个
ObjectStreamField
描述了一个存储在序列化流中的字段。虽然默认机制将为类的每个实际实例字段创建一个
ObjectStreamField
,但通过
static final ObjectStreamField[]serialPersistentFields
字段重写它的可能性的存在正是为了声明与实际实例字段不匹配的流字段列表

这样的字段不能通过默认算法处理,默认算法只是通过反射读取和写入字段值。相反,需要专用的
writeObject
readObject
方法来读取和写入流字段并处理其值

这里的问题是类
VirtualFilePermissionCollection
具有不匹配的字段声明,因为流字段名为
list
,实际实例字段名为
permissions
,以及适当的
readObject
方法(尽管不必要地使用反射来访问其字段)但是缺少匹配的
writeObject
方法。由于缺少专用的
writeObject
方法,因此使用默认算法并失败,因为如上所述,字段不匹配

private static final ObjectStreamField[] serialPersistentFields = {
             new ObjectStreamField("list", VirtualFilePermission[].class)
     };