diff options
author | mkoch <mkoch@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-12-23 22:06:01 +0000 |
---|---|---|
committer | mkoch <mkoch@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-12-23 22:06:01 +0000 |
commit | cfeea221cc0559a0060b3af43ba3c58ce5d0c9de (patch) | |
tree | cf9911a00c5d1b39db4f88ffc6c7f626cad43bf9 /libjava/java/io/ObjectStreamClass.java | |
parent | 100e0119cc61c919f08dfd058546edb3ecfff4f5 (diff) |
2003-12-23 Guilhem Lavaux <guilhem@kaffe.org>
* java/io/ObjectInputStream.java
(getField): Handle transient and non persistent fields.
(readClassDescriptor): Better error handling, use the right
class loader.
(readFields): Fields marked as not present in the stream
or not to be set are not read and set.
* java/io/ObjectInputStream.java
(readFields): Changed implementation of GetField.
(readClassDescriptor): Documented.
* java/io/ObjectOutputStream.java
(writeClassDescriptor): Added condition when to write class super
class information.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@74985 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/java/io/ObjectStreamClass.java')
-rw-r--r-- | libjava/java/io/ObjectStreamClass.java | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/libjava/java/io/ObjectStreamClass.java b/libjava/java/io/ObjectStreamClass.java index 0be9a7e5053..9d9d99d33d1 100644 --- a/libjava/java/io/ObjectStreamClass.java +++ b/libjava/java/io/ObjectStreamClass.java @@ -516,9 +516,12 @@ public class ObjectStreamClass implements Serializable && Modifier.isPrivate (modifiers)) { fields = getSerialPersistentFields (cl); - Arrays.sort (fields); - calculateOffsets (); - return; + if (fields != null) + { + Arrays.sort(fields); + calculateOffsets(); + return; + } } } catch (NoSuchFieldException ignore) @@ -700,16 +703,41 @@ public class ObjectStreamClass implements Serializable } } - // Returns the value of CLAZZ's private static final field named - // `serialPersistentFields'. + /** + * Returns the value of CLAZZ's private static final field named + * `serialPersistentFields'. It performs some sanity checks before + * returning the real array. Besides, the returned array is a clean + * copy of the original. So it can be modified. + * + * @param clazz Class to retrieve 'serialPersistentFields' from. + * @return The content of 'serialPersistentFields'. + */ private ObjectStreamField[] getSerialPersistentFields (Class clazz) throws NoSuchFieldException, IllegalAccessException { + ObjectStreamField[] fieldsArray = null; + ObjectStreamField[] o; + // Use getDeclaredField rather than getField for the same reason // as above in getDefinedSUID. Field f = clazz.getDeclaredField("serialPersistentFields"); f.setAccessible(true); - return (ObjectStreamField[]) f.get(null); + + int modifiers = f.getModifiers(); + if (!(Modifier.isStatic(modifiers) + && Modifier.isFinal(modifiers) + && Modifier.isPrivate(modifiers))) + return null; + + o = (ObjectStreamField[]) f.get(null); + + if (o == null) + return null; + + fieldsArray = new ObjectStreamField[o.length]; + System.arraycopy(o, 0, fieldsArray, 0, o.length); + + return fieldsArray; } public static final ObjectStreamField[] NO_FIELDS = {}; |