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:

Additional context
None