class SCQRoll implements Demarshallable, WriteMarshallable {
    private int length;
    @Nullable
    private String format;
    @Nullable
    private LocalTime rollTime;
    @Nullable
    private ZoneId rollTimeZone;
    private long epoch;

    /**
     * used by {@link Demarshallable}
     *
     * @param wire a wire
     */
    @UsedViaReflection
    private SCQRoll(@NotNull WireIn wire) {
        length = wire.read(RollFields.length).int32();
        format = wire.read(RollFields.format).text();
        epoch = wire.read(RollFields.epoch).int64();
        ValueIn rollTimeVIN = wire.read(RollFields.rollTime);
        if (rollTimeVIN.hasNext())
            rollTime = rollTimeVIN.time();
        String zoneId = wire.read(RollFields.rollTimeZone).text();
        if (zoneId != null)
            rollTimeZone = ZoneId.of(zoneId);
        else
            rollTimeZone = null;
    }

    SCQRoll(@NotNull RollCycle rollCycle,
            long epoch,
            @Nullable LocalTime rollTime,
            @Nullable ZoneId rollTimeZone) {
        this.length = rollCycle.lengthInMillis();
        this.format = rollCycle.format();
        this.epoch = epoch;
        this.rollTime = rollTime;
        this.rollTimeZone = rollTimeZone;
    }

    @Override
    public void writeMarshallable(@NotNull WireOut wire) {
        wire.write(RollFields.length).int32(length)
                .write(RollFields.format).text(format)
                .write(RollFields.epoch).int64(epoch);
        if (rollTime != null)
            wire.write(RollFields.rollTime).time(rollTime);
        if (rollTimeZone != null)
            wire.write(RollFields.rollTimeZone).text(rollTimeZone.getId());

    }

    /**
     * @return an epoch offset as the number of number of milliseconds since January 1, 1970,
     * 00:00:00 GMT
     */
    public long epoch() {
        return this.epoch;
    }

    public String format() {
        return this.format;
    }

    int length() {
        return length;
    }

    @Nullable
    public LocalTime rollTime() {
        return rollTime;
    }

    @Nullable
    public ZoneId rollTimeZone() {
        return rollTimeZone;
    }

    public void length(int length) {
        this.length = length;
    }

    public void format(@Nullable String format) {
        this.format = format;
    }

    public void rollTime(@Nullable LocalTime rollTime) {
        this.rollTime = rollTime;
    }

    public void rollTimeZone(@Nullable ZoneId rollTimeZone) {
        this.rollTimeZone = rollTimeZone;
    }

    public void epoch(long epoch) {
        this.epoch = epoch;
    }

    @Override
    public String toString() {<FILL_FUNCTION_BODY>}

    enum RollFields implements WireKey {
        length, format, epoch, rollTime, rollTimeZone
    }
}

        return "SCQRoll{" +
                "length=" + length +
                ", format='" + format + '\'' +
                ", epoch=" + epoch +
                ", rollTime=" + rollTime +
                ", rollTimeZone=" + rollTimeZone +
                '}';
    
<no_super_class>