public class MatsSerializerJson
extends java.lang.Object
implements io.mats3.serial.MatsSerializer<java.lang.String>
MatsSerializer that employs Jackson JSON
library for serialization and deserialization, and compress and decompress using Deflater and
Inflater.
The Jackson ObjectMapper is configured to only handle fields (think "data struct"), i.e. not use setters or
getters; and to only include non-null fields; and upon deserialization to ignore properties from the JSON that has no
field in the class to be deserialized into (both to enable the modification of DTOs on the client side by removing
fields that aren't used in that client scenario, and to handle widening conversions for incoming DTOs), and to
use string serialization for dates (and handle the JSR310 new dates):
// Create Jackson ObjectMapper ObjectMapper mapper = new ObjectMapper(); // Do not use setters and getters, thus only fields, and ignore visibility modifiers. mapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE); mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); // Drop null fields (null fields in DTOs are dropped from serialization to JSON) mapper.setSerializationInclusion(Include.NON_NULL); // Do not fail on unknown fields (i.e. if DTO class to deserialize to lacks fields that are present in the JSON) mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // Handle the java.time classes sanely, i.e. as dates, not a bunch of integers. mapper.registerModule(new JavaTimeModule()); // .. and write dates and times as Strings, e.g. 2020-11-15 mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); // Handle JDK8 Optionals as normal fields. mapper.registerModule(new Jdk8Module());
| Modifier and Type | Field and Description |
|---|---|
static int |
DEFAULT_COMPRESSION_LEVEL
The default compression level - which I chose to be
Deflater.BEST_SPEED (compression level 1), since I
assume that the rather small incremental reduction in size does not outweigh the pretty large increase in time,
as one hopefully runs on a pretty fast network (and that the MQ backing store is fast). |
static java.lang.String |
IDENTIFICATION |
| Modifier | Constructor and Description |
|---|---|
protected |
MatsSerializerJson(int compressionLevel)
Constructs a MatsSerializer, using the specified Compression Level - refer to
Deflater's constants and
levels. |
| Modifier and Type | Method and Description |
|---|---|
protected byte[] |
compress(byte[] data) |
static MatsSerializerJson |
create()
Constructs a MatsSerializer, using the
DEFAULT_COMPRESSION_LEVEL (which is Deflater.BEST_SPEED,
which is 1). |
static MatsSerializerJson |
create(int compressionLevel)
Constructs a MatsSerializer, using the specified Compression Level - refer to
Deflater's constants and
levels. |
io.mats3.serial.MatsTrace<java.lang.String> |
createNewMatsTrace(java.lang.String traceId,
java.lang.String flowId,
io.mats3.serial.MatsTrace.KeepMatsTrace keepMatsTrace,
boolean nonPersistent,
boolean interactive,
long ttlMillis,
boolean noAudit) |
protected byte[] |
decompress(byte[] data,
int offset,
int length,
int bestGuessDecompressedSize) |
io.mats3.serial.MatsSerializer.DeserializedMatsTrace<java.lang.String> |
deserializeMatsTrace(byte[] matsTraceBytes,
int offset,
int length,
java.lang.String meta) |
io.mats3.serial.MatsSerializer.DeserializedMatsTrace<java.lang.String> |
deserializeMatsTrace(byte[] matsTraceBytes,
java.lang.String meta) |
<T> T |
deserializeObject(java.lang.String serialized,
java.lang.Class<T> type) |
boolean |
handlesMeta(java.lang.String meta) |
<T> T |
newInstance(java.lang.Class<T> clazz) |
io.mats3.serial.MatsSerializer.SerializedMatsTrace |
serializeMatsTrace(io.mats3.serial.MatsTrace<java.lang.String> matsTrace) |
java.lang.String |
serializeObject(java.lang.Object object) |
public static java.lang.String IDENTIFICATION
public static int DEFAULT_COMPRESSION_LEVEL
Deflater.BEST_SPEED (compression level 1), since I
assume that the rather small incremental reduction in size does not outweigh the pretty large increase in time,
as one hopefully runs on a pretty fast network (and that the MQ backing store is fast).protected MatsSerializerJson(int compressionLevel)
Deflater's constants and
levels.compressionLevel - the compression level given to Deflater to use.public static MatsSerializerJson create()
DEFAULT_COMPRESSION_LEVEL (which is Deflater.BEST_SPEED,
which is 1).public static MatsSerializerJson create(int compressionLevel)
Deflater's constants and
levels.compressionLevel - the compression level given to Deflater to use.public boolean handlesMeta(java.lang.String meta)
handlesMeta in interface io.mats3.serial.MatsSerializer<java.lang.String>public io.mats3.serial.MatsTrace<java.lang.String> createNewMatsTrace(java.lang.String traceId,
java.lang.String flowId,
io.mats3.serial.MatsTrace.KeepMatsTrace keepMatsTrace,
boolean nonPersistent,
boolean interactive,
long ttlMillis,
boolean noAudit)
createNewMatsTrace in interface io.mats3.serial.MatsSerializer<java.lang.String>public io.mats3.serial.MatsSerializer.SerializedMatsTrace serializeMatsTrace(io.mats3.serial.MatsTrace<java.lang.String> matsTrace)
serializeMatsTrace in interface io.mats3.serial.MatsSerializer<java.lang.String>public io.mats3.serial.MatsSerializer.DeserializedMatsTrace<java.lang.String> deserializeMatsTrace(byte[] matsTraceBytes,
java.lang.String meta)
deserializeMatsTrace in interface io.mats3.serial.MatsSerializer<java.lang.String>public io.mats3.serial.MatsSerializer.DeserializedMatsTrace<java.lang.String> deserializeMatsTrace(byte[] matsTraceBytes,
int offset,
int length,
java.lang.String meta)
deserializeMatsTrace in interface io.mats3.serial.MatsSerializer<java.lang.String>public java.lang.String serializeObject(java.lang.Object object)
serializeObject in interface io.mats3.serial.MatsSerializer<java.lang.String>public <T> T deserializeObject(java.lang.String serialized,
java.lang.Class<T> type)
deserializeObject in interface io.mats3.serial.MatsSerializer<java.lang.String>public <T> T newInstance(java.lang.Class<T> clazz)
newInstance in interface io.mats3.serial.MatsSerializer<java.lang.String>protected byte[] compress(byte[] data)
protected byte[] decompress(byte[] data,
int offset,
int length,
int bestGuessDecompressedSize)