@NotNull
  @Override
  public CharSequence read(Bytes bytes, @Nullable CharSequence ignored) {
    long size = bytes.readStopBit();
    if (size == NULL_LENGTH) return null;
    if (size < 0 || size > Integer.MAX_VALUE)
      throw new IllegalStateException("Invalid length: " + size);
    if (size == 0) return "";

    char[] chars = new char[(int) size];
    int length = bytes.readInt();
    long limit = bytes.readLimit();
    try {
      bytes.readLimit(bytes.readPosition() + length);
      DataInputStream dis =
          new DataInputStream(
              new BufferedInputStream(new InflaterInputStream(bytes.inputStream())));
      for (int i = 0; i < size; i++) chars[i] = (char) (dis.readByte() & 0xff);

    } catch (IOException e) {
      throw new IORuntimeException(e);
    } finally {
      bytes.readPosition(bytes.readLimit());
      bytes.readLimit(limit);
    }
    try {
      return STRING_FACTORY.fromChars(chars);
    } catch (Exception e) {
      throw new AssertionError(e);
    }
  }
 @NotNull
 @Override
 public A read(Bytes in, A using) {
   if (using == null) using = new A();
   using.str_ = in.readUtf8();
   int size = (int) in.readStopBit();
   if (size >= 0) {
     if (using.list_ == null) {
       using.list_ = new ArrayList<>(size);
     } else {
       using.list_.clear();
       if (using.list_ instanceof ArrayList) ((ArrayList) using.list_).ensureCapacity(size);
     }
     for (int i = 0; i < size; i++) {
       B b = new B();
       b.readMarshallable(in);
       using.list_.add(b);
     }
   } else {
     assert size == -1;
     using.list_ = null;
   }
   return using;
 }