msgpack / msgpack-java

MessagePack serializer implementation for Java / msgpack.org[Java]
http://msgpack.org/
Apache License 2.0
1.41k stars 321 forks source link

timestamp (de)serialization not work on msgpack-jackson 0.9.3 #674

Closed changwoo closed 2 years ago

changwoo commented 2 years ago

I saw the news of timestamp extension support on version 0.9.0 and tried it. But I still can't (de)serialize timestamps with the 0.9.3 version. Is it supported also when using Jackson?

I did like this and the "Instant" was serialized as a map of string keys "epochSecond"/"nano" and uint32 values.

private static class A {
    @JsonProperty(index = 0)
    Instant instant = Instant.now();
}

....

    A a = new A();
    ObjectMapper objectMapper = new MessagePackMapper();
    byte[] bytes = objectMapper.writeValueAsBytes(a);
komamitsu commented 2 years ago

Yes. I don't think Jackson can handle private classes.

public class Pojo {
    public int i = 42;
    public Instant now = Instant.now();
}

  :

    ObjectMapper mapper = new ObjectMapper(new MessagePackFactory());
    Pojo x = new Pojo();
    byte[] bytes = mapper.writeValueAsBytes(x);
    System.out.println(mapper.readValue(bytes, new TypeReference<Map<String, Object>>() {}));
        >>>> {i=42, now={epochSecond=1662712326, nano=653000000}}
changwoo commented 2 years ago

Yes. I don't think Jackson can handle private classes.

public class Pojo {
    public int i = 42;
    public Instant now = Instant.now();
}

  :

    ObjectMapper mapper = new ObjectMapper(new MessagePackFactory());
    Pojo x = new Pojo();
    byte[] bytes = mapper.writeValueAsBytes(x);
    System.out.println(mapper.readValue(bytes, new TypeReference<Map<String, Object>>() {}));
        >>>> {i=42, now={epochSecond=1662712326, nano=653000000}}

Jackson CAN handle private classes.

I mean, the timestamps were not serialized in the extension format.

Your example Pojo class was serialized like this:

// 82 a1 69 2a a3 6e 6f 77 82 ab 65 70 6f 63 68 53 65 63 6f 6e 64 ce 63 1d 90 50 a4 6e 61 6e 6f ce 05 8b 11 40 
//       i  42    n  o  w        e  p  o  c  h  S  e  c  o  n  d                    n  a  n  o

This is not the timestamp extension format. It's just a map with string keys and uint32 values.

komamitsu commented 2 years ago

Oops. Sorry, I misread your comment the other way around.

Supporting only Instant shouldn't be difficult. But someone may want to use java.time.LocalDateTime or other classes. Let me think about it...

komamitsu commented 2 years ago

We decided to simply support only Instant. With the feature introduced by https://github.com/msgpack/msgpack-java/pull/677, Instant instances will be serialized and deserialized automatically.