java.sql.Timestamp not persisted with full precision (original) (raw)
Describe the bug
java.sql.Timestamp supports nanosecond precision, but data is truncated to milliseconds after being serialised and deserialised.
To Reproduce
import static org.assertj.core.api.Assertions.assertThat;
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.sql.Timestamp; import java.time.Instant;
import org.junit.jupiter.api.Test;
import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output;
class KryoTimestampTest {
@Test void timestampRoundtrip() {
var k = new Kryo();
k.setRegistrationRequired(false);
var bytes = new ByteArrayOutputStream();
var originalTimestamp = new Timestamp(Instant.parse("2022-03-16T17:03:05Z").toEpochMilli());
originalTimestamp.setNanos(123456789);
assertThat(originalTimestamp.toInstant()).isEqualTo(Instant.parse("2022-03-16T17:03:05.123456789Z"));
try(var out = new Output(bytes)) {
k.writeClassAndObject(out, originalTimestamp);
}
try(var in = new Input(new ByteArrayInputStream(bytes.toByteArray()))) {
var deserialisedTimestamp = (Timestamp) k.readClassAndObject(in);
assertThat(deserialisedTimestamp.toInstant()).isEqualTo(Instant.parse("2022-03-16T17:03:05.123456789Z"));
}} }
Environment:
- OS: Debian
- JDK Version: 17.0.2
- Kryo Version: 5.3.0
Additional context
None