public static QualifiedName deserialize(ByteBuffer byteBuffer) {
    int size = ReadWriteIOUtils.readInt(byteBuffer);
    List<Identifier> originalParts = new ArrayList<>(size);
    while (size-- > 0) {
      originalParts.add((Identifier) Expression.deserialize(byteBuffer));
    }

    size = ReadWriteIOUtils.readInt(byteBuffer);
    List<String> parts = new ArrayList<>(size);
    while (size-- > 0) {
      parts.add(ReadWriteIOUtils.readString(byteBuffer));
    }

    String name = ReadWriteIOUtils.readString(byteBuffer);

    byte hasPrefixByte = ReadWriteIOUtils.readByte(byteBuffer);
    QualifiedName prefix = null;
    if (hasPrefixByte == 1) {
      prefix = QualifiedName.deserialize(byteBuffer);
    }

    String suffix = ReadWriteIOUtils.readString(byteBuffer);

    return new QualifiedName(originalParts, parts, name, prefix, suffix);
  }
For an identifier of the form "a.b.c.d", returns "a.b.c", For an identifier of the form "a",
returns absent
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/QualifiedName.java