code: 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;
    }
docs: 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}.