code: public function marshal(Message $message)
      {
          $schema = $message::schema();
          $message->validate();
  
          $payload = [];
  
          foreach ($schema->getFields() as $field) {
              $fieldName = $field->getName();
  
              if (!$message->has($fieldName)) {
                  /*
                  if ($message->hasClearedField($fieldName)) {
                      $payload[$fieldName] = ['NULL' => true];
                  }
                  */
                  continue;
              }
  
              $value = $message->get($fieldName);
  
              switch ($field->getRule()->getValue()) {
                  case FieldRule::A_SINGLE_VALUE:
                      $payload[$fieldName] = $this->encodeValue($value, $field);
                      break;
  
                  case FieldRule::A_SET:
                      $payload[$fieldName] = $this->encodeASetValue($value, $field);
                      break;
  
                  case FieldRule::A_LIST:
                      $list = [];
                      foreach ($value as $v) {
                          $list[] = $this->encodeValue($v, $field);
                      }
                      $payload[$fieldName] = ['L' => $list];
                      break;
  
                  case FieldRule::A_MAP:
                      $map = [];
                      foreach ($value as $k => $v) {
                          $map[$k] = $this->encodeValue($v, $field);
                      }
                      $payload[$fieldName] = ['M' => $map];
                      break;
  
                  default:
                      break;
              }
          }
  
          return $payload;
      }
docs: @param Message $message
  
  @return array
  
  @throws \Exception
  @throws GdbotsPbjException