Class MatsSerializerJson

  • All Implemented Interfaces:
    io.mats3.serial.MatsSerializer<java.lang.String>

    public class MatsSerializerJson
    extends java.lang.Object
    implements io.mats3.serial.MatsSerializer<java.lang.String>
    Implementation of 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());
     
    • Nested Class Summary

      • Nested classes/interfaces inherited from interface io.mats3.serial.MatsSerializer

        io.mats3.serial.MatsSerializer.DeserializedMatsTrace<Z extends java.lang.Object>, io.mats3.serial.MatsSerializer.SerializationException, io.mats3.serial.MatsSerializer.SerializedMatsTrace
    • Field Summary

      Fields 
      Modifier and Type Field 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  
      • Fields inherited from interface io.mats3.serial.MatsSerializer

        META_KEY_POSTFIX
    • Constructor Summary

      Constructors 
      Modifier Constructor Description
      protected MatsSerializerJson​(int compressionLevel)
      Constructs a MatsSerializer, using the specified Compression Level - refer to Deflater's constants and levels.
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      protected void adjustStreamReadConstraints​(com.fasterxml.jackson.databind.ObjectMapper mapper)  
      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)  
      protected void extraConfigureObjectMapper​(com.fasterxml.jackson.databind.ObjectMapper mapper)
      Override if you want to change the Jackson ObjectMapper.
      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)  
      int sizeOfSerialized​(java.lang.String s)  
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • IDENTIFICATION

        public static java.lang.String IDENTIFICATION
      • DEFAULT_COMPRESSION_LEVEL

        public 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).
    • Constructor Detail

      • MatsSerializerJson

        protected MatsSerializerJson​(int compressionLevel)
        Constructs a MatsSerializer, using the specified Compression Level - refer to Deflater's constants and levels.
        Parameters:
        compressionLevel - the compression level given to Deflater to use.
    • Method Detail

      • create

        public static MatsSerializerJson create​(int compressionLevel)
        Constructs a MatsSerializer, using the specified Compression Level - refer to Deflater's constants and levels.
        Parameters:
        compressionLevel - the compression level given to Deflater to use.
      • adjustStreamReadConstraints

        protected void adjustStreamReadConstraints​(com.fasterxml.jackson.databind.ObjectMapper mapper)
      • extraConfigureObjectMapper

        protected void extraConfigureObjectMapper​(com.fasterxml.jackson.databind.ObjectMapper mapper)
        Override if you want to change the Jackson ObjectMapper. Not really recommended.
      • handlesMeta

        public boolean handlesMeta​(java.lang.String meta)
        Specified by:
        handlesMeta in interface io.mats3.serial.MatsSerializer<java.lang.String>
      • createNewMatsTrace

        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)
        Specified by:
        createNewMatsTrace in interface io.mats3.serial.MatsSerializer<java.lang.String>
      • serializeMatsTrace

        public io.mats3.serial.MatsSerializer.SerializedMatsTrace serializeMatsTrace​(io.mats3.serial.MatsTrace<java.lang.String> matsTrace)
        Specified by:
        serializeMatsTrace in interface io.mats3.serial.MatsSerializer<java.lang.String>
      • deserializeMatsTrace

        public io.mats3.serial.MatsSerializer.DeserializedMatsTrace<java.lang.String> deserializeMatsTrace​(byte[] matsTraceBytes,
                                                                                                           java.lang.String meta)
        Specified by:
        deserializeMatsTrace in interface io.mats3.serial.MatsSerializer<java.lang.String>
      • deserializeMatsTrace

        public io.mats3.serial.MatsSerializer.DeserializedMatsTrace<java.lang.String> deserializeMatsTrace​(byte[] matsTraceBytes,
                                                                                                           int offset,
                                                                                                           int length,
                                                                                                           java.lang.String meta)
        Specified by:
        deserializeMatsTrace in interface io.mats3.serial.MatsSerializer<java.lang.String>
      • serializeObject

        public java.lang.String serializeObject​(java.lang.Object object)
        Specified by:
        serializeObject in interface io.mats3.serial.MatsSerializer<java.lang.String>
      • sizeOfSerialized

        public int sizeOfSerialized​(java.lang.String s)
        Specified by:
        sizeOfSerialized in interface io.mats3.serial.MatsSerializer<java.lang.String>
      • deserializeObject

        public <T> T deserializeObject​(java.lang.String serialized,
                                       java.lang.Class<T> type)
        Specified by:
        deserializeObject in interface io.mats3.serial.MatsSerializer<java.lang.String>
      • newInstance

        public <T> T newInstance​(java.lang.Class<T> clazz)
        Specified by:
        newInstance in interface io.mats3.serial.MatsSerializer<java.lang.String>
      • compress

        protected byte[] compress​(byte[] data)
      • decompress

        protected byte[] decompress​(byte[] data,
                                    int offset,
                                    int length,
                                    int bestGuessDecompressedSize)