# Class ReplicationStream

java.lang.Object
java.io.InputStream
java.io.ObjectInputStream
org.apache.catalina.tribes.io.ReplicationStream

All Implemented Interfaces:
  `Closeable, DataInput, ObjectInput, ObjectStreamConstants, AutoCloseable`

public final class ReplicationStream extends ObjectInputStream
Custom subclass of `ObjectInputStream` that loads from the class loader for this web application. This allows classes defined only with the web application to be found correctly.

- ## Nested Class Summary

  ### Nested classes/interfaces inherited from class ObjectInputStream

  `ObjectInputStream.GetField`

- ## Field Summary

  ### Fields inherited from interface ObjectStreamConstants

  `baseWireHandle, PROTOCOL_VERSION_1, PROTOCOL_VERSION_2, SC_BLOCK_DATA, SC_ENUM, SC_EXTERNALIZABLE, SC_SERIALIZABLE, SC_WRITE_METHOD, SERIAL_FILTER_PERMISSION, STREAM_MAGIC, STREAM_VERSION, SUBCLASS_IMPLEMENTATION_PERMISSION, SUBSTITUTION_PERMISSION, TC_ARRAY, TC_BASE, TC_BLOCKDATA, TC_BLOCKDATALONG, TC_CLASS, TC_CLASSDESC, TC_ENDBLOCKDATA, TC_ENUM, TC_EXCEPTION, TC_LONGSTRING, TC_MAX, TC_NULL, TC_OBJECT, TC_PROXYCLASSDESC, TC_REFERENCE, TC_RESET, TC_STRING`

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `ReplicationStream(InputStream stream, ClassLoader[] classLoaders)`
  Construct a new instance of CustomObjectInputStream

- ## Method Summary

  Modifier and Type
  Method
  Description
  `void`
  `close()`
  `Class<?>`
  `findExternalClass(String name)`
  `Class<?>`
  `findReplicationClass(String name)`
  `Class<?>`
  `resolveClass(ObjectStreamClass classDesc)`
  Load the local class equivalent of the specified stream class description, by using the class loader assigned to this Context.
  `Class<?>`
  `resolveClass(String name)`
  `protected Class<?>`
  `resolveProxyClass(String[] interfaces)`
  ObjectInputStream.resolveProxyClass has some funky way of using the incorrect class loader to resolve proxy classes, let's do it our way instead

  ### Methods inherited from class ObjectInputStream

  `available, defaultReadObject, enableResolveObject, getObjectInputFilter, read, read, readBoolean, readByte, readChar, readClassDescriptor, readDouble, readFields, readFloat, readFully, readFully, readInt, readLine, readLong, readObject, readObjectOverride, readShort, readStreamHeader, readUnshared, readUnsignedByte, readUnsignedShort, readUTF, registerValidation, resolveObject, setObjectInputFilter, skipBytes`

  ### Methods inherited from class InputStream

  `mark, markSupported, nullInputStream, read, readAllBytes, readNBytes, readNBytes, reset, skip, skipNBytes, transferTo`

  ### Methods inherited from class Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

  ### Methods inherited from interface ObjectInput

  `read, skip`

- ## Constructor Details

  - ### ReplicationStream

    public ReplicationStream(InputStream stream, ClassLoader[] classLoaders) throws IOException
    Construct a new instance of CustomObjectInputStream
    Parameters:
      `stream` - The input stream we will read from
      `classLoaders` - The class loader array used to instantiate objects
    Throws:
      `IOException` - if an input/output error occurs

- ## Method Details

  - ### resolveClass

    public Class<?> resolveClass(ObjectStreamClass classDesc) throws ClassNotFoundException, IOException
    Load the local class equivalent of the specified stream class description, by using the class loader assigned to this Context.
    Overrides:
      `resolveClass` in class `ObjectInputStream`
    Parameters:
      `classDesc` - Class description from the input stream
    Throws:
      `ClassNotFoundException` - if this class cannot be found
      `IOException` - if an input/output error occurs

  - ### resolveClass

    public Class<?> resolveClass(String name) throws ClassNotFoundException
    Throws:
      `ClassNotFoundException`

  - ### resolveProxyClass

    protected Class<?> resolveProxyClass(String[] interfaces) throws IOException, ClassNotFoundException
    ObjectInputStream.resolveProxyClass has some funky way of using the incorrect class loader to resolve proxy classes, let's do it our way instead
    Overrides:
      `resolveProxyClass` in class `ObjectInputStream`
    Throws:
      `IOException`
      `ClassNotFoundException`

  - ### findReplicationClass

    public Class<?> findReplicationClass(String name) throws ClassNotFoundException
    Throws:
      `ClassNotFoundException`

  - ### findExternalClass

    public Class<?> findExternalClass(String name) throws ClassNotFoundException
    Throws:
      `ClassNotFoundException`

  - ### close

    public void close() throws IOException
    Specified by:
      `close` in interface `AutoCloseable`
    Specified by:
      `close` in interface `Closeable`
    Specified by:
      `close` in interface `ObjectInput`
    Overrides:
      `close` in class `ObjectInputStream`
    Throws:
      `IOException`