docs: private void getParseBytesMethodCode(MethodCode mc) {
  
          StringBuilder code = new StringBuilder();
          // define return
          code.append(ClassHelper.getInternalName(cls.getCanonicalName())).append(" ret = new ");
          code.append(ClassHelper.getInternalName(cls.getCanonicalName())).append("()");
          mc.appendLineCode1(code.toString());
          code.setLength(0);
  
          // 执行初始化，主要针对枚举类型
          for (FieldInfo field : fields) {
              boolean isList = field.isList();
              if (field.getFieldType() == FieldType.ENUM) {
                  String clsName = ClassHelper.getInternalName(field.getField().getType().getCanonicalName());
                  if (!isList) {
                      String express =
                              "CodedConstant.getEnumValue(" + clsName + ".class, " + clsName + ".values()[0].name())";
                      // add set get method
                      mc.appendLineCode1(getSetToField("ret", field.getField(), cls, express, isList, field.isMap()));
  
                  }
              }
          }
  
          // add parse method code here
          mc.appendLineCode0("try {");
          mc.appendLineCode1(ClassCode.CODE_FORMAT + "boolean done = false");
          mc.appendLineCode1(ClassCode.CODE_FORMAT + "Codec codec = null");
          mc.appendLineCode0(ClassCode.CODE_FORMAT + "while (!done) {");
          mc.appendLineCode1(ClassCode.CODE_FORMAT + "int tag = input.readTag()");
          mc.appendLineCode0(ClassCode.CODE_FORMAT + "if (tag == 0) { break;}");
  
          for (FieldInfo field : fields) {
              boolean isList = field.isList();
  
              if (field.getFieldType() != FieldType.DEFAULT) {
                  code.append("if (tag == ").append(CodedConstant.makeTag(field.getOrder(),
                          field.getFieldType().getInternalFieldType().getWireType()));
                  code.append(") {");
  
                  mc.appendLineCode0(code.toString());
              } else {
                  code.append("if (tag == CodedConstant.makeTag(").append(field.getOrder());
                  code.append(",WireFormat.").append(field.getFieldType().getWireFormat()).append(")) {");
                  mc.appendLineCode0(code.toString());
              }
              code.setLength(0);
  
              String t = field.getFieldType().getType();
              t = CodedConstant.capitalize(t);
  
              boolean listTypeCheck = false;
              String express;
  
              // enumeration type
              if (field.getFieldType() == FieldType.ENUM) {
                  String clsName = ClassHelper.getInternalName(field.getField().getType().getCanonicalName());
                  if (isList) {
                      if (field.getGenericKeyType() != null) {
                          Class cls = field.getGenericKeyType();
                          clsName = ClassHelper.getInternalName(cls.getCanonicalName());
                      }
                  }
                  express = "CodedConstant.getEnumValue(" + clsName + ".class, CodedConstant.getEnumName(" + clsName
                          + ".values()," + "input.read" + t + "()))";
              } else {
                  express = "input.read" + t + "()";
              }
  
              // if List type and element is object message type
              if (isList && field.getFieldType() == FieldType.OBJECT) {
                  if (field.getGenericKeyType() != null) {
                      Class cls = field.getGenericKeyType();
  
                      String name = ClassHelper.getInternalName(cls.getCanonicalName()); // need
                                                                                // to
                                                                                // parse
                                                                                // nested
                                                                                // class
                      code.append("codec = ProtobufProxy.create(").append(name).append(".class");
                      if (debug) {
                          code.append(", true");
                      } else {
                          code.append(", false");
                      }
  
                      String spath = "ProtobufProxy.OUTPUT_PATH.get()";
                      code.append(",").append(spath);
                      code.append(")");
                      mc.appendLineCode1(code.toString());
                      code.setLength(0);
  
                      mc.appendLineCode1("int length = input.readRawVarint32()");
                      mc.appendLineCode1("final int oldLimit = input.pushLimit(length)");
                      listTypeCheck = true;
                      express = "(" + name + ") codec.readFrom(input)";
  
                  }
              } else if (field.getFieldType() == FieldType.OBJECT) { // if object
                                                                     // message
                                                                     // type
                  Class cls = field.getField().getType();
                  String name = ClassHelper.getInternalName(cls.getCanonicalName()); // need
                                                                            // to
                                                                            // parse
                                                                            // nested
                                                                            // class
                  code.append("codec = ProtobufProxy.create(").append(name).append(".class");
                  if (debug) {
                      code.append(", true");
                  } else {
                      code.append(", false");
                  }
  
                  String spath = "ProtobufProxy.OUTPUT_PATH.get()";
                  code.append(",").append(spath);
                  code.append(")");
                  mc.appendLineCode1(code.toString());
                  code.setLength(0);
  
                  mc.appendLineCode1("int length = input.readRawVarint32()");
                  mc.appendLineCode1("final int oldLimit = input.pushLimit(length)");
  
                  listTypeCheck = true;
                  express = "(" + name + ") codec.readFrom(input)";
              }
  
              if (field.getFieldType() == FieldType.BYTES) {
                  express += ".toByteArray()";
              }
  
              mc.appendLineCode1(getSetToField("ret", field.getField(), cls, express, isList, field.isMap()));
  
              if (listTypeCheck) {
                  mc.appendLineCode1("input.checkLastTagWas(0)");
                  mc.appendLineCode1("input.popLimit(oldLimit)");
              }
  
              mc.appendLineCode1("continue");
              mc.appendLineCode0("}");
  
          }
  
          mc.appendLineCode1("input.skipField(tag)");
          mc.appendLineCode0("}");
          mc.appendLineCode0("} catch (com.google.protobuf.InvalidProtocolBufferException e) {");
          mc.appendLineCode1("throw e");
          mc.appendLineCode0("} catch (java.io.IOException e) {");
          mc.appendLineCode1("throw e");
          mc.appendLineCode0("}");
  
          for (FieldInfo field : fields) {
              if (field.isRequired()) {
                  mc.appendLineCode0(CodedConstant.getRetRequiredCheck(getAccessByField("ret", field.getField(), cls),
                          field.getField()));
              }
          }
  
          mc.appendLineCode1("return ret");
      }