Visitar URL original
Support timestamp extension in jackson-dataformat-msgpack by komamitsu · Pull Request #677 · msgpack/msgpack-java · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Use msgpack-core's serde for timestamp internally
  • Loading branch information
komamitsu committed Sep 13, 2022
commit 0010e05621215e77ce8a70bfaba1c88d09f3c687
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,11 @@
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import org.msgpack.core.ExtensionTypeHeader;
import org.msgpack.core.MessagePack;
import org.msgpack.core.MessagePacker;
import org.msgpack.core.MessageUnpacker;
import org.msgpack.value.TimestampValue;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.time.Instant;

Expand Down Expand Up @@ -39,6 +42,20 @@ protected InstantSerializer(Class<Instant> t)
public void serialize(Instant value, JsonGenerator gen, SerializerProvider provider)
throws IOException
{
ByteArrayOutputStream os = new ByteArrayOutputStream();
// MEMO: Reusing these MessagePacker and MessageUnpacker instances would improve the performance
try (MessagePacker packer = MessagePack.newDefaultPacker(os)) {
packer.packTimestamp(value);
}
try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(os.toByteArray())) {
ExtensionTypeHeader header = unpacker.unpackExtensionTypeHeader();
byte[] bytes = unpacker.readPayload(header.getLength());

MessagePackExtensionType extensionType = new MessagePackExtensionType(EXT_TYPE, bytes);
gen.writeObject(extensionType);
}

/*
int nanos = value.getNano();
long epochSeconds = value.getEpochSecond();

Expand All @@ -55,6 +72,8 @@ public void serialize(Instant value, JsonGenerator gen, SerializerProvider provi
MessagePackExtensionType extensionType = new MessagePackExtensionType(EXT_TYPE, bytes);

gen.writeObject(extensionType);

*/
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
import org.junit.Before;
import org.junit.Test;
import org.msgpack.core.MessagePack;
import org.msgpack.core.MessagePacker;
import org.msgpack.core.MessageUnpacker;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
Expand Down Expand Up @@ -77,20 +79,51 @@ public void testTripleInstantsPojo()
assertEquals(now.plusSeconds(1), deserialized.c);
}

@Test
public void deserialize32BitFormat()
throws IOException
{
Instant instant = Instant.ofEpochSecond(Instant.now().getEpochSecond());

ByteArrayOutputStream os = new ByteArrayOutputStream();
try (MessagePacker packer = MessagePack.newDefaultPacker(os)) {
packer.packMapHeader(1)
.packString("instant")
.packTimestamp(instant);
}

byte[] bytes = os.toByteArray();
try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(bytes)) {
unpacker.unpackMapHeader();
unpacker.unpackString();
assertEquals(4, unpacker.unpackExtensionTypeHeader().getLength());
}

SingleInstant deserialized = objectMapper.readValue(bytes, SingleInstant.class);
assertEquals(instant, deserialized.instant);
}

@Test
public void deserialize64BitFormat()
throws IOException
{
Instant now = Instant.now();
Instant instant = Instant.ofEpochSecond(Instant.now().getEpochSecond(), 1234);

ByteArrayOutputStream os = new ByteArrayOutputStream();
MessagePack.newDefaultPacker(os)
.packMapHeader(1)
.packString("instant")
.packTimestamp(now)
.close();

SingleInstant deserialized = objectMapper.readValue(os.toByteArray(), SingleInstant.class);
assertEquals(now, deserialized.instant);
try (MessagePacker packer = MessagePack.newDefaultPacker(os)) {
packer.packMapHeader(1)
.packString("instant")
.packTimestamp(instant);
}

byte[] bytes = os.toByteArray();
try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(bytes)) {
unpacker.unpackMapHeader();
unpacker.unpackString();
assertEquals(8, unpacker.unpackExtensionTypeHeader().getLength());
}

SingleInstant deserialized = objectMapper.readValue(bytes, SingleInstant.class);
assertEquals(instant, deserialized.instant);
}
}