class_docstr: Timetable that triggers DAG runs according to a cron expression.
  
  This is different from ``CronDataIntervalTimetable``, where the cron
  expression specifies the *data interval* of a DAG run. With this timetable,
  the data intervals are specified independently from the cron expression.
  Also for the same reason, this timetable kicks off a DAG run immediately at
  the start of the period (similar to POSIX cron), instead of needing to wait
  for one data interval to pass.
  
  Don't pass ``@once`` in here; use ``OnceTimetable`` instead.
code: def serialize(self) -> dict[str, Any]:
      from airflow.serialization.serialized_objects import (
          encode_relativedelta,
          encode_timezone,
      )
  
      interval: float | dict[str, Any]
      if isinstance(self._interval, datetime.timedelta):
          interval = self._interval.total_seconds()
      else:
          interval = encode_relativedelta(self._interval)
      timezone = encode_timezone(self._timezone)
      return {
          "expression": self._expression,
          "timezone": timezone,
          "interval": interval,
      }
  
file_path: airflow/airflow/timetables/trigger.py
imports: from __future__ import annotations
  import datetime
  from typing import TYPE_CHECKING, Any
  from pendulum import DateTime
  from airflow.timetables._cron import CronMixin
  from airflow.timetables.base import DagRunInfo, DataInterval, Timetable
label_desc: Use image node_id 3 for calling the CronTriggerTimetable obj's underlying member method code with example usage: obj.serialize() and returns: dict