private void callReadMethod (Object obj, ObjectStreamClass osc) throws IOException
private void callReadMethod (Method readObject, Class klass, Object obj) throws IOException
  private void callReadMethod (Object obj, ObjectStreamClass osc) throws IOException  {    Class klass = osc.forClass();    try      {	Class classArgs[] = {ObjectInputStream.class};	Method m = getMethod (klass, "readObject", classArgs);	Object args[] = {this};	m.invoke(obj, args);      }    catch (NoSuchMethodException nsme)      {	// Nothing.      }    catch (InvocationTargetException x)      {        /* Rethrow if possible. */	Throwable exception = x.getTargetException();	if (exception instanceof RuntimeException)	  throw (RuntimeException) exception;	if (exception instanceof IOException)	  throw (IOException) exception;	throw new IOException("Exception thrown from readObject() on " +			       klass + ": " + exception.getClass().getName());      }    catch (Exception x)      {	throw new IOException("Failure invoking readObject() on " +			       klass + ": " + x.getClass().getName());      }    // Invalidate fields which has been read through readFields.    prereadFields = null;  }