jdk/src/share/classes/java/time/zone/ZoneOffsetTransitionRule.java
changeset 19841 15c8e97d6a14
parent 17474 8c100beabcc0
child 20795 8ec9e5b79828
equal deleted inserted replaced
19822:4e10a58fa28f 19841:15c8e97d6a14
    65 import static java.time.temporal.TemporalAdjuster.previousOrSame;
    65 import static java.time.temporal.TemporalAdjuster.previousOrSame;
    66 
    66 
    67 import java.io.DataInput;
    67 import java.io.DataInput;
    68 import java.io.DataOutput;
    68 import java.io.DataOutput;
    69 import java.io.IOException;
    69 import java.io.IOException;
       
    70 import java.io.InvalidObjectException;
    70 import java.io.Serializable;
    71 import java.io.Serializable;
    71 import java.time.DayOfWeek;
    72 import java.time.DayOfWeek;
    72 import java.time.LocalDate;
    73 import java.time.LocalDate;
    73 import java.time.LocalDateTime;
    74 import java.time.LocalDateTime;
    74 import java.time.LocalTime;
    75 import java.time.LocalTime;
   229         this.offsetAfter = offsetAfter;
   230         this.offsetAfter = offsetAfter;
   230     }
   231     }
   231 
   232 
   232     //-----------------------------------------------------------------------
   233     //-----------------------------------------------------------------------
   233     /**
   234     /**
   234      * Uses a serialization delegate.
   235      * Defend against malicious streams.
       
   236      * @return never
       
   237      * @throws InvalidObjectException always
       
   238      */
       
   239     private Object readResolve() throws InvalidObjectException {
       
   240         throw new InvalidObjectException("Deserialization via serialization delegate");
       
   241     }
       
   242 
       
   243     /**
       
   244      * Writes the object using a
       
   245      * <a href="../../../serialized-form.html#java.time.zone.Ser">dedicated serialized form</a>.
       
   246      * @serialData
       
   247      * Refer to the serialized form of
       
   248      * <a href="../../../serialized-form.html#java.time.zone.ZoneRules">ZoneRules.writeReplace</a>
       
   249      * for the encoding of epoch seconds and offsets.
       
   250      * <pre style="font-size:1.0em">{@code
       
   251      *
       
   252      *      out.writeByte(3);                // identifies a ZoneOffsetTransition
       
   253      *      final int timeSecs = (timeEndOfDay ? 86400 : time.toSecondOfDay());
       
   254      *      final int stdOffset = standardOffset.getTotalSeconds();
       
   255      *      final int beforeDiff = offsetBefore.getTotalSeconds() - stdOffset;
       
   256      *      final int afterDiff = offsetAfter.getTotalSeconds() - stdOffset;
       
   257      *      final int timeByte = (timeSecs % 3600 == 0 ? (timeEndOfDay ? 24 : time.getHour()) : 31);
       
   258      *      final int stdOffsetByte = (stdOffset % 900 == 0 ? stdOffset / 900 + 128 : 255);
       
   259      *      final int beforeByte = (beforeDiff == 0 || beforeDiff == 1800 || beforeDiff == 3600 ? beforeDiff / 1800 : 3);
       
   260      *      final int afterByte = (afterDiff == 0 || afterDiff == 1800 || afterDiff == 3600 ? afterDiff / 1800 : 3);
       
   261      *      final int dowByte = (dow == null ? 0 : dow.getValue());
       
   262      *      int b = (month.getValue() << 28) +          // 4 bits
       
   263      *              ((dom + 32) << 22) +                // 6 bits
       
   264      *              (dowByte << 19) +                   // 3 bits
       
   265      *              (timeByte << 14) +                  // 5 bits
       
   266      *              (timeDefinition.ordinal() << 12) +  // 2 bits
       
   267      *              (stdOffsetByte << 4) +              // 8 bits
       
   268      *              (beforeByte << 2) +                 // 2 bits
       
   269      *              afterByte;                          // 2 bits
       
   270      *      out.writeInt(b);
       
   271      *      if (timeByte == 31) {
       
   272      *          out.writeInt(timeSecs);
       
   273      *      }
       
   274      *      if (stdOffsetByte == 255) {
       
   275      *          out.writeInt(stdOffset);
       
   276      *      }
       
   277      *      if (beforeByte == 3) {
       
   278      *          out.writeInt(offsetBefore.getTotalSeconds());
       
   279      *      }
       
   280      *      if (afterByte == 3) {
       
   281      *          out.writeInt(offsetAfter.getTotalSeconds());
       
   282      *      }
       
   283      * }
       
   284      * </pre>
   235      *
   285      *
   236      * @return the replacing object, not null
   286      * @return the replacing object, not null
   237      */
   287      */
   238     private Object writeReplace() {
   288     private Object writeReplace() {
   239         return new Ser(Ser.ZOTRULE, this);
   289         return new Ser(Ser.ZOTRULE, this);