/**
   * Write the specified object to the ObjectOutputStream. Objects referenced by this object are
   * written transitively so that a complete equivalent graph of objects can be reconstructed by an
   * ObjectInputStream.
   *
   * <p>Exceptions are thrown for problems with the OutputStream and for classes that should not be
   * serialized. All exceptions are fatal to the OutputStream, which is left in an indeterminate
   * state, and it is up to the caller to ignore or recover the stream state.
   *
   * @throws IOException Any exception thrown by the underlying OutputStream.
   */
  public final void writeObject(Object obj) throws IOException {
    try {
      // Find an appropriate surrogate for the object
      SerializationSurrogate surrogate = this.mSelector.getSurrogateForObject(obj, _cacheContext);
      // write type handle

      Class[] type;
      if (surrogate instanceof ObjectSerializationSurrogate) {
        SerializationSurrogate testSurrogate = null;

        testSurrogate = getType(surrogate, obj.getClass());

        if (testSurrogate != null) {
          surrogate = testSurrogate;
        }
      }

      surrogate.writeHandle(this, obj);
      if (surrogate.getSubHandle() > 0) surrogate.writeSubHandle(this, obj);
      surrogate.writeObject(this, obj);
    } catch (CacheIOException nCacheIOException) {
      // this.writeObject(obj);
      throw new IOException(nCacheIOException.toString() + " is not marked as serializable.");
    } catch (Exception ex) {
      throw new IOException(ex.toString());
    }
  }
  /**
   * Write the specified object to the ObjectOutputStream. Objects referenced by this object are
   * written transitively so that a complete equivalent graph of objects can be reconstructed by an
   * ObjectInputStream.
   *
   * <p>Exceptions are thrown for problems with the OutputStream and for classes that should not be
   * serialized. All exceptions are fatal to the OutputStream, which is left in an indeterminate
   * state, and it is up to the caller to ignore or recover the stream state.
   *
   * @param obj the object to be written
   * @param objClass the class surrogate to use for writing the object.
   * @exception IOException Any of the usual Input/Output related exceptions.
   * @throws IOException Any exception thrown by the underlying OutputStream.
   */
  public void writeObject(Object obj, Class objClass) throws IOException {
    if (obj == null) {
      throw new NullPointerException("obj");
    }
    if (objClass == null) {
      throw new NullPointerException("objClass");
    }

    try {
      SerializationSurrogate surrogate =
          this.mSelector.getSurrogateForType(objClass, _cacheContext);
      surrogate.writeObject(this, obj);
    } catch (Exception ex) {
      throw new IOException(ex.toString());
    }
  }