ret_val = processResoultion (array, handle);
ret_val = processResolution (array, handle);
  public final Object readObject () throws ClassNotFoundException, IOException  {    if (this.useSubclassMethod)      return readObjectOverride ();    boolean was_deserializing;    Object ret_val;    was_deserializing = this.isDeserializing;    if (! was_deserializing)      setBlockDataMode (false);    this.isDeserializing = true;//    DEBUG ("MARKER ");    byte marker = this.realInputStream.readByte ();    switch (marker)    {      case TC_BLOCKDATA:      case TC_BLOCKDATALONG:	readNextBlock (marker);	throw new BlockDataException (this.blockDataBytes);      case TC_NULL:	ret_val = null;	break;      case TC_REFERENCE:      {//	DEBUG ("REFERENCE ");	Integer oid = new Integer (this.realInputStream.readInt ());	ret_val = ((ObjectIdentityWrapper)		   this.objectLookupTable.get (oid)).object;	break;      }      case TC_CLASS:      {	ObjectStreamClass osc = (ObjectStreamClass)readObject ();	Class clazz = osc.forClass ();	assignNewHandle (clazz);	ret_val = clazz;	break;      }      case TC_CLASSDESC:      {//	DEBUG ("CLASSDESC NAME ");	String name = this.realInputStream.readUTF ();//	DEBUG ("UID ");	long uid = this.realInputStream.readLong ();//	DEBUG ("FLAGS ");	byte flags = this.realInputStream.readByte ();//	DEBUG ("FIELD COUNT ");	short field_count = this.realInputStream.readShort ();	ObjectStreamField[] fields = new ObjectStreamField[field_count];	ObjectStreamClass osc = new ObjectStreamClass (name, uid,						       flags, fields);	assignNewHandle (osc);	for (int i=0; i < field_count; i++)	{//	  DEBUG ("TYPE CODE ");	  char type_code = (char)this.realInputStream.readByte ();//	  DEBUG ("FIELD NAME ");	  String field_name = this.realInputStream.readUTF ();	  String class_name;	  if (type_code == 'L' || type_code == '[')	    class_name = (String)readObject ();	  else	    class_name = String.valueOf (type_code);	  fields[i] =	    new ObjectStreamField (field_name,				   TypeSignature.getClassForEncoding				   (class_name));	}	setBlockDataMode (true);	osc.setClass (resolveClass (osc));	setBlockDataMode (false);//	DEBUG ("ENDBLOCKDATA ");	if (this.realInputStream.readByte () != TC_ENDBLOCKDATA)	  throw new IOException ("Data annotated to class was not consumed.");	osc.setSuperclass ((ObjectStreamClass)readObject ());	ret_val = osc;	break;      }      case TC_STRING:      {//	DEBUG ("STRING ");	String s = this.realInputStream.readUTF ();	ret_val = processResoultion (s, assignNewHandle (s));	break;      }      case TC_ARRAY:      {	ObjectStreamClass osc = (ObjectStreamClass)readObject ();	Class componenetType = osc.forClass ().getComponentType ();//	DEBUG ("ARRAY LENGTH ");	int length = this.realInputStream.readInt ();	Object array = Array.newInstance (componenetType, length);	int handle = assignNewHandle (array);	readArrayElements (array, componenetType);	ret_val = processResoultion (array, handle);	break;      }      case TC_OBJECT:      {	ObjectStreamClass osc = (ObjectStreamClass)readObject ();	Class clazz = osc.forClass ();	if (!Serializable.class.isAssignableFrom (clazz))	  throw new NotSerializableException (clazz + " is not Serializable, and thus cannot be deserialized.");	if (Externalizable.class.isAssignableFrom (clazz))	{	  Externalizable obj = null;	  try	  {	    obj = (Externalizable)clazz.newInstance ();	  }	  catch (InstantiationException e)	  {	    throw new ClassNotFoundException ("Instance of " + clazz					      + " could not be created");	  }	  catch (IllegalAccessException e)	  {	    throw new ClassNotFoundException ("Instance of " + clazz					      + " could not be created because class or zero-argument constructor is not accessible");	  }	  catch (NoSuchMethodError e)	  {	    throw new ClassNotFoundException ("Instance of " + clazz					      + " could not be created because zero-argument constructor is not defined");	  }	  int handle = assignNewHandle (obj);	  boolean read_from_blocks = ((osc.getFlags () & SC_BLOCK_DATA) != 0);	  if (read_from_blocks)	    setBlockDataMode (true);	  obj.readExternal (this);	  if (read_from_blocks)	    setBlockDataMode (false);	  ret_val = processResoultion (obj, handle);	  break;	} // end if (Externalizable.class.isAssignableFrom (clazz))	// find the first non-serializable, non-abstract	// class in clazz's inheritance hierarchy	Class first_nonserial = clazz.getSuperclass ();	while (Serializable.class.isAssignableFrom (first_nonserial)	       || Modifier.isAbstract (first_nonserial.getModifiers ()))	  first_nonserial = first_nonserial.getSuperclass ();//	DEBUGln ("Using " + first_nonserial//		 + " as starting point for constructing " + clazz);	Object obj = null;	obj = newObject (clazz, first_nonserial);	if (obj == null)	  throw new ClassNotFoundException ("Instance of " + clazz +					    " could not be created");	int handle = assignNewHandle (obj);	this.currentObject = obj;	ObjectStreamClass[] hierarchy =	  ObjectStreamClass.getObjectStreamClasses (clazz);//	DEBUGln ("Got class hierarchy of depth " + hierarchy.length);	boolean has_read;	for (int i=0; i < hierarchy.length; i++)	{	  this.currentObjectStreamClass = hierarchy[i];//	  DEBUGln ("Reading fields of "//		   + this.currentObjectStreamClass.getName ());	  has_read = true;	  try	  {	    this.currentObjectStreamClass.forClass ().	      getDeclaredMethod ("readObject", readObjectParams);	  }	  catch (NoSuchMethodException e)	  {	    has_read = false;	  }	  // XXX: should initialize fields in classes in the hierarchy	  // that aren't in the stream	  // should skip over classes in the stream that aren't in the	  // real classes hierarchy	  readFields (obj, this.currentObjectStreamClass.fields,		      has_read, this.currentObjectStreamClass);	  if (has_read)	  {//	    DEBUG ("ENDBLOCKDATA? ");	    if (this.realInputStream.readByte () != TC_ENDBLOCKDATA)	      throw new IOException ("No end of block data seen for class with readObject (ObjectInputStream) method.");	  }	}	this.currentObject = null;	this.currentObjectStreamClass = null;	ret_val = processResoultion (obj, handle);	break;      }      case TC_RESET:	clearHandles ();	ret_val = readObject ();	break;      case TC_EXCEPTION:      {	Exception e = (Exception)readObject ();	clearHandles ();	throw new WriteAbortedException ("Exception thrown during writing of stream", e);      }      default:	throw new IOException ("Unknown marker on stream");    }    this.isDeserializing = was_deserializing;    if (! was_deserializing)    {      setBlockDataMode (true);      if (validators.size () > 0)	invokeValidators ();    }    return ret_val;  }