@Override
  protected String buildWriteMethodBody() {
    resetStringBuilder();
    buildString("{");

    buildString("if($2 == null) {");
    buildString("  if($3) {");
    buildString(
        "    throw new %s(\"Attempted to write null\");", MessageTypeException.class.getName());
    buildString("  }");
    buildString("  $1.writeNil();");
    buildString("  return;");
    buildString("}");

    buildString("%s _$$_t = (%s)$2;", origName, origName);
    buildString("$1.writeArrayBegin(%d);", entries.length);

    for (int i = 0; i < entries.length; i++) {
      BeansFieldEntry e = entries[i];
      if (!e.isAvailable()) {
        buildString("$1.writeNil();");
        continue;
      }
      Class<?> type = e.getType();
      if (type.isPrimitive()) {
        buildString("$1.%s(_$$_t.%s());", primitiveWriteName(type), e.getGetterName());
      } else {
        buildString("if(_$$_t.%s() == null) {", e.getGetterName());
        if (e.isNotNullable()) {
          buildString("throw new %s();", MessageTypeException.class.getName());
        } else {
          buildString("$1.writeNil();");
        }
        buildString("} else {");
        buildString("  this.templates[%d].write($1, _$$_t.%s());", i, e.getGetterName());
        buildString("}");
      }
    }

    buildString("$1.writeArrayEnd();");
    buildString("}");
    return getBuiltString();
  }