public Object read(int token, DataInputStream inputStream) throws IOException {
    String className = tupleSerialization.getClassNameFor(token);

    if (className == null) className = WritableUtils.readString(inputStream);

    Deserializer deserializer = deserializers.get(className);

    if (deserializer == null) {
      deserializer = tupleSerialization.getNewDeserializer(className);
      deserializer.open(inputStream);
      deserializers.put(className, deserializer);
    }

    Object foundObject = null;
    Object object = null;

    try {
      object = deserializer.deserialize(foundObject);
    } catch (IOException exception) {
      LOG.error(
          "failed deserializing token: " + token + " with classname: " + className, exception);

      throw exception;
    }

    return object;
  }
  /**
   * Constructor SerializationElementReader creates a new SerializationElementReader instance.
   *
   * @param tupleSerialization of type TupleSerialization
   */
  public SerializationElementReader(TupleSerialization tupleSerialization) {
    this.tupleSerialization = tupleSerialization;

    tupleSerialization.initTokenMaps();
  }