@Override boolean readLengthPrefixAndValue(ReadBuffer b, Span.Builder builder) {
      int length = b.readVarint32();
      if (length == 0) return false;
      int endPos = b.pos() + length;

      // now, we are in the annotation fields
      long timestamp = 0L;
      String value = null;
      while (b.pos() < endPos) {
        int nextKey = b.readVarint32();
        switch (nextKey) {
          case TIMESTAMP_KEY:
            timestamp = TIMESTAMP.readValue(b);
            break;
          case VALUE_KEY:
            value = VALUE.readLengthPrefixAndValue(b);
            break;
          default:
            logAndSkip(b, nextKey);
        }
      }
      if (timestamp == 0L || value == null) return false;
      builder.addAnnotation(timestamp, value);
      return true;
    }
Contributes to a builder as opposed to reading values directly. Avoids allocation.
zipkin/src/main/java/zipkin2/internal/Proto3ZipkinFields.java