core/src/main/java/com/twitter/elephantbird/mapreduce/io/BinaryWritable.java
public M get() {
    // may be we should rename this method. the contract would be less
    // confusing with a different name.
    if (message == null && messageBytes != null) {
      checkConverter();
      try {
        return converter.fromBytes(messageBytes);
      } catch (DecodeException e) {
        throw new IllegalStateException("Converter failed to deserialize", e);
      }
    }
    return message;
  }
public M get() {
    // may be we should rename this method. the contract would be less
    // confusing with a different name.
    if (message == null && messageBytes != null) {
      checkConverter();
      try {
        return converter.fromBytes(messageBytes);
      } catch (DecodeException e) {
        throw new IllegalStateException("Converter failed to deserialize", e);
      }
    }
    return message;
  }
Returns the current object. Subsequent calls to get() may not return the
same object, but in stead might return a new object deserialized from same
set of bytes. As a result, multiple calls to get() should be avoided, and
modifications to an object returned by get() may not
reflect even if this writable is serialized later. <br>
Please use set() to be certain of what object is serialized.<br><br>

The deserialization of the actual Protobuf/Thrift object is often delayed
till the first call to this method. <br>
In some cases the the parameterized proto class may not be known yet
( in case of default construction. see {@link #setConverter(Class)} ),
and this will throw an {@link IllegalStateException}.