1 |
/* ObjectInputStream.java -- Class used to read serialized objects |
/* ObjectInputStream.java -- Class used to read serialized objects |
2 |
Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. |
Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2005 |
3 |
|
Free Software Foundation, Inc. |
4 |
|
|
5 |
This file is part of GNU Classpath. |
This file is part of GNU Classpath. |
6 |
|
|
537 |
// find the first non-serializable, non-abstract |
// find the first non-serializable, non-abstract |
538 |
// class in clazz's inheritance hierarchy |
// class in clazz's inheritance hierarchy |
539 |
Class first_nonserial = clazz.getSuperclass(); |
Class first_nonserial = clazz.getSuperclass(); |
540 |
while (Serializable.class.isAssignableFrom(first_nonserial) |
// Maybe it is a primitive class, those don't have a super class, |
541 |
|| Modifier.isAbstract(first_nonserial.getModifiers())) |
// or Object itself. Otherwise we can keep getting the superclass |
542 |
|
// till we hit the Object class, or some other non-serializable class. |
543 |
|
if (first_nonserial == null) |
544 |
|
first_nonserial = clazz; |
545 |
|
else |
546 |
|
while (Serializable.class.isAssignableFrom(first_nonserial) |
547 |
|
|| Modifier.isAbstract(first_nonserial.getModifiers())) |
548 |
first_nonserial = first_nonserial.getSuperclass(); |
first_nonserial = first_nonserial.getSuperclass(); |
549 |
|
|
550 |
final Class local_constructor_class = first_nonserial; |
final Class local_constructor_class = first_nonserial; |
574 |
osc.realClassIsExternalizable = Externalizable.class.isAssignableFrom(clazz); |
osc.realClassIsExternalizable = Externalizable.class.isAssignableFrom(clazz); |
575 |
|
|
576 |
ObjectStreamField[] stream_fields = osc.fields; |
ObjectStreamField[] stream_fields = osc.fields; |
577 |
ObjectStreamField[] real_fields = ObjectStreamClass.lookup(clazz).fields; |
ObjectStreamField[] real_fields = ObjectStreamClass.lookupForClassObject(clazz).fields; |
578 |
ObjectStreamField[] fieldmapping = new ObjectStreamField[2 * Math.max(stream_fields.length, real_fields.length)]; |
ObjectStreamField[] fieldmapping = new ObjectStreamField[2 * Math.max(stream_fields.length, real_fields.length)]; |
579 |
|
|
580 |
int stream_idx = 0; |
int stream_idx = 0; |
740 |
protected Class resolveClass(ObjectStreamClass osc) |
protected Class resolveClass(ObjectStreamClass osc) |
741 |
throws ClassNotFoundException, IOException |
throws ClassNotFoundException, IOException |
742 |
{ |
{ |
743 |
return Class.forName(osc.getName(), true, currentLoader()); |
try |
744 |
|
{ |
745 |
|
return Class.forName(osc.getName(), true, currentLoader()); |
746 |
|
} |
747 |
|
catch (ClassNotFoundException cnfe) |
748 |
|
{ |
749 |
|
// Maybe it was an primitive class? |
750 |
|
String name = osc.getName(); |
751 |
|
if (name.equals("void")) |
752 |
|
return Void.TYPE; |
753 |
|
if (name.equals("boolean")) |
754 |
|
return Boolean.TYPE; |
755 |
|
if (name.equals("byte")) |
756 |
|
return Byte.TYPE; |
757 |
|
if (name.equals("short")) |
758 |
|
return Short.TYPE; |
759 |
|
if (name.equals("char")) |
760 |
|
return Character.TYPE; |
761 |
|
if (name.equals("int")) |
762 |
|
return Integer.TYPE; |
763 |
|
if (name.equals("long")) |
764 |
|
return Long.TYPE; |
765 |
|
if (name.equals("float")) |
766 |
|
return Float.TYPE; |
767 |
|
if (name.equals("double")) |
768 |
|
return Double.TYPE; |
769 |
|
if (name.equals("void")) |
770 |
|
return Void.TYPE; |
771 |
|
|
772 |
|
throw cnfe; |
773 |
|
} |
774 |
} |
} |
775 |
|
|
776 |
/** |
/** |
803 |
*/ |
*/ |
804 |
private ObjectStreamClass lookupClass(Class clazz) |
private ObjectStreamClass lookupClass(Class clazz) |
805 |
{ |
{ |
806 |
ObjectStreamClass oclazz; |
if (clazz == null) |
807 |
|
return null; |
808 |
|
|
809 |
|
ObjectStreamClass oclazz; |
810 |
oclazz = (ObjectStreamClass)classLookupTable.get(clazz); |
oclazz = (ObjectStreamClass)classLookupTable.get(clazz); |
811 |
if (oclazz == null) |
if (oclazz == null) |
812 |
return ObjectStreamClass.lookup(clazz); |
return ObjectStreamClass.lookup(clazz); |