From bc9c5cf1a5c5ddb8cc23179922fc8af981deb099 Mon Sep 17 00:00:00 2001 From: Graeme Rocher Date: Mon, 7 Nov 2022 15:53:53 +0100 Subject: [PATCH] Serialize LocalDateTime to string always. Fixes #284 (#311) * Serialize LocalDateTime to string always. Fixes #284 --- .../serde/support/serdes/LocalDateTimeSerde.java | 10 ++-------- .../serde/AbstractBasicSerdeCompileSpec.groovy | 16 +++++++++------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/serde-support/src/main/java/io/micronaut/serde/support/serdes/LocalDateTimeSerde.java b/serde-support/src/main/java/io/micronaut/serde/support/serdes/LocalDateTimeSerde.java index 82a2bab7e..e04d248b8 100644 --- a/serde-support/src/main/java/io/micronaut/serde/support/serdes/LocalDateTimeSerde.java +++ b/serde-support/src/main/java/io/micronaut/serde/support/serdes/LocalDateTimeSerde.java @@ -16,10 +16,7 @@ package io.micronaut.serde.support.serdes; import java.io.IOException; -import java.time.Instant; import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalQuery; @@ -54,14 +51,11 @@ public TemporalQuery query() { @Override protected void serializeWithoutFormat(Encoder encoder, EncoderContext context, LocalDateTime value, Argument type) throws IOException { - encoder.encodeLong(value.toInstant(ZoneOffset.UTC).toEpochMilli()); + encoder.encodeString(getDefaultFormatter().format(value)); } @Override protected LocalDateTime deserializeNonNullWithoutFormat(Decoder decoder, DecoderContext decoderContext, Argument type) throws IOException { - return LocalDateTime.ofInstant( - Instant.ofEpochMilli(decoder.decodeLong()), - ZoneId.from(ZoneOffset.UTC) - ); + return getDefaultFormatter().parse(decoder.decodeString(), LocalDateTime::from); } } diff --git a/serde-tck/src/main/groovy/io/micronaut/serde/AbstractBasicSerdeCompileSpec.groovy b/serde-tck/src/main/groovy/io/micronaut/serde/AbstractBasicSerdeCompileSpec.groovy index 688a79e46..5748e1ff6 100644 --- a/serde-tck/src/main/groovy/io/micronaut/serde/AbstractBasicSerdeCompileSpec.groovy +++ b/serde-tck/src/main/groovy/io/micronaut/serde/AbstractBasicSerdeCompileSpec.groovy @@ -45,7 +45,7 @@ class Test { private $type.name value; public void setValue($type.name value) { this.value = value; - } + } public $type.name getValue() { return value; } @@ -106,7 +106,7 @@ class Test { private $type value; public void setValue($type value) { this.value = value; - } + } public $type getValue() { return value; } @@ -141,7 +141,7 @@ class Test { private $type.name value; public void setValue($type.name value) { this.value = value; - } + } public $type.name getValue() { return value; } @@ -185,7 +185,7 @@ class Test { private $type.componentType.name[] value; public void setValue($type.componentType.name[] value) { this.value = value; - } + } public $type.componentType.name[] getValue() { return value; } @@ -245,7 +245,7 @@ class Test { private $type.componentType.name[] value; public void setValue($type.componentType.name[] value) { this.value = value; - } + } public $type.componentType.name[] getValue() { return value; } @@ -287,7 +287,7 @@ class Test { private $type value; public void setValue($type value) { this.value = value; - } + } public $type getValue() { return value; } @@ -334,7 +334,7 @@ class Test { private $type.name value; public void setValue($type.name value) { this.value = value; - } + } public $type.name getValue() { return value; } @@ -355,6 +355,8 @@ class Test { Instant | Instant.now() | { Instant i -> i.toEpochMilli() } LocalTime | LocalTime.now() | { LocalTime i -> i.toSecondOfDay() } LocalDate | LocalDate.now() | { LocalDate d -> d } + LocalDateTime | LocalDateTime.MAX | { LocalDateTime i -> LocalDateTime.MAX } + LocalDateTime | LocalDateTime.MIN | { LocalDateTime i -> LocalDateTime.MIN } LocalDateTime | LocalDateTime.now() | { LocalDateTime i -> i.toInstant(ZoneOffset.from(ZoneOffset.UTC)).toEpochMilli() } ZonedDateTime | ZonedDateTime.now() | { ZonedDateTime i -> i.toInstant().toEpochMilli() } Duration | Duration.ofSeconds(10) | { Duration d -> d.toSeconds() }