public static Trigger readTrigger(MarshallerReaderContext inCtx)
      throws IOException, ClassNotFoundException {
    short triggerInt = inCtx.readShort();

    switch (triggerInt) {
      case PersisterEnums.CRON_TRIGGER:
        {
          long startTime = inCtx.readLong();

          CronTrigger trigger = new CronTrigger();
          trigger.setStartTime(new Date(startTime));
          if (inCtx.readBoolean()) {
            long endTime = inCtx.readLong();
            trigger.setEndTime(new Date(endTime));
          }

          int repeatLimit = inCtx.readInt();
          trigger.setRepeatLimit(repeatLimit);

          int repeatCount = inCtx.readInt();
          trigger.setRepeatCount(repeatCount);

          String expr = inCtx.readUTF();
          trigger.setCronExpression(expr);
          if (inCtx.readBoolean()) {
            long nextFireTime = inCtx.readLong();
            trigger.setNextFireTime(new Date(nextFireTime));
          }

          String[] calendarNames = (String[]) inCtx.readObject();
          trigger.setCalendarNames(calendarNames);
          return trigger;
        }
      case PersisterEnums.INT_TRIGGER:
        {
          IntervalTrigger trigger = new IntervalTrigger();
          long startTime = inCtx.readLong();
          trigger.setStartTime(new Date(startTime));
          if (inCtx.readBoolean()) {
            long endTime = inCtx.readLong();
            trigger.setEndTime(new Date(endTime));
          }
          int repeatLimit = inCtx.readInt();
          trigger.setRepeatLimit(repeatLimit);
          int repeatCount = inCtx.readInt();
          trigger.setRepeatCount(repeatCount);
          if (inCtx.readBoolean()) {
            long nextFireTime = inCtx.readLong();
            trigger.setNextFireTime(new Date(nextFireTime));
          }
          long period = inCtx.readLong();
          trigger.setPeriod(period);
          String[] calendarNames = (String[]) inCtx.readObject();
          trigger.setCalendarNames(calendarNames);
          return trigger;
        }
      case PersisterEnums.POINT_IN_TIME_TRIGGER:
        {
          long startTime = inCtx.readLong();

          PointInTimeTrigger trigger = new PointInTimeTrigger(startTime, null, null);
          return trigger;
        }
    }
    throw new RuntimeException("Unable to persist Trigger for type: " + triggerInt);
  }