diff options
author | Guilhem Lavaux <guilhem@kaffe.org> | 2003-12-23 22:06:01 +0000 |
---|---|---|
committer | Michael Koch <mkoch@gcc.gnu.org> | 2003-12-23 22:06:01 +0000 |
commit | 692fb023ef14a4690ee766c0596306353175aeec (patch) | |
tree | cf9911a00c5d1b39db4f88ffc6c7f626cad43bf9 /libjava/java/io/ObjectStreamClass.java | |
parent | f2073745a81b0687b24f40c1549769be5917987f (diff) | |
download | gcc-692fb023ef14a4690ee766c0596306353175aeec.zip gcc-692fb023ef14a4690ee766c0596306353175aeec.tar.gz gcc-692fb023ef14a4690ee766c0596306353175aeec.tar.bz2 |
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.
From-SVN: r74985
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 0be9a7e..9d9d99d 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 = {}; |