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); |