question: public void readExternal ( ObjectInput in ) throws IOException , ClassNotFoundException { byte [ ] hdr = new byte [ RES_HEADER_SIZE ] ; in . readFully ( hdr ) ; resType = U . bytesToInt ( hdr , 0 ) ; boolean hasErr = hdr [ 4 ] != 0 ; if ( hasErr ) { err = in . readUTF ( ) ; errCode = in . readInt ( ) ; if ( resType == RES_TYPE_ERR_STREAM_ID ) res = in . readLong ( ) ; return ; } switch ( resType ) { case RES_TYPE_BOOLEAN : res = in . readBoolean ( ) ; break ; case RES_TYPE_LONG : res = in . readLong ( ) ; break ; case RES_TYPE_IGFS_PATH : { boolean hasVal = in . readBoolean ( ) ; if ( hasVal ) res = IgfsUtils . readPath ( in ) ; break ; } case RES_TYPE_IGFS_PATH_SUMMARY : { boolean hasVal = in . readBoolean ( ) ; if ( hasVal ) { IgfsPathSummary sum = new IgfsPathSummary ( ) ; sum . readExternal ( in ) ; res = sum ; } break ; } case RES_TYPE_IGFS_FILE : { boolean hasVal = in . readBoolean ( ) ; if ( hasVal ) { IgfsFileImpl file = new IgfsFileImpl ( ) ; file . readExternal ( in ) ; res = file ; } break ; } case RES_TYPE_IGFS_STREAM_DESCRIPTOR : { boolean hasVal = in . readBoolean ( ) ; if ( hasVal ) { IgfsInputStreamDescriptor desc = new IgfsInputStreamDescriptor ( ) ; desc . readExternal ( in ) ; res = desc ; } break ; } case RES_TYPE_HANDSHAKE : { boolean hasVal = in . readBoolean ( ) ; if ( hasVal ) { IgfsHandshakeResponse msg = new IgfsHandshakeResponse ( ) ; msg . readExternal ( in ) ; res = msg ; } break ; } case RES_TYPE_STATUS : { boolean hasVal = in . readBoolean ( ) ; if ( hasVal ) { IgfsStatus msg = new IgfsStatus ( ) ; msg . readExternal ( in ) ; res = msg ; } break ; } case RES_TYPE_COL_IGFS_FILE : { Collection < IgfsFile > files = null ; int size = in . readInt ( ) ; if ( size >= 0 ) { files = new ArrayList < > ( size ) ; for ( int i = 0 ; i < size ; i ++ ) { IgfsFileImpl file = new IgfsFileImpl ( ) ; file . readExternal ( in ) ; files . add ( file ) ; } } res = files ; break ; } case RES_TYPE_COL_IGFS_PATH : { Collection < IgfsPath > paths = null ; int size = in . readInt ( ) ; if ( size >= 0 ) { paths = new ArrayList < > ( size ) ; for ( int i = 0 ; i < size ; i ++ ) paths . add ( IgfsUtils . readPath ( in ) ) ; } res = paths ; break ; } case RES_TYPE_COL_IGFS_BLOCK_LOCATION : { Collection < IgfsBlockLocation > locations = null ; int size = in . readInt ( ) ; if ( size >= 0 ) { locations = new ArrayList < > ( size ) ; for ( int i = 0 ; i < size ; i ++ ) { IgfsBlockLocationImpl location = new IgfsBlockLocationImpl ( ) ; location . readExternal ( in ) ; locations . add ( location ) ; } } res = locations ; break ; } case RES_TYPE_BYTE_ARRAY : assert false : "Response type of byte array should never be processed by marshaller." ; } }
target:  Reads object from data input.