Java 到达serialPersistentFields中声明的静态字段
所以xstream(v1.4.8)使用了这一行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
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)
};