Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package com.fasterxml.jackson.databind.ser.std;
  
  import java.util.UUID;
  
Specialized com.fasterxml.jackson.databind.JsonSerializer to output java.util.UUIDs. Beyond optimized access and writing of textual representation (which is the default handling in most cases), it will alternatively allow serialization using raw binary output (as 16-byte block) if underlying data format has efficient means to access that.
 
 public class UUIDSerializer
     extends StdScalarSerializer<UUID>
 {
     final static char[] HEX_CHARS = "0123456789abcdef".toCharArray();
     
     public UUIDSerializer() { super(UUID.class); }
 
     @Override
     public boolean isEmpty(UUID value)
     {
         if (value == null) {
             return true;
         }
         // Null UUID is empty, so...
         if (value.getLeastSignificantBits() == 0L
                 && value.getMostSignificantBits() == 0L) {
             return true;
         }
         return false;
     }
     
     @Override
     public void serialize(UUID valueJsonGenerator jgenSerializerProvider provider)
         throws IOExceptionJsonGenerationException
     {
         // First: perhaps we could serialize it as raw binary data?
         if (jgen.canWriteBinaryNatively()) {
             jgen.writeBinary(_asBytes(value));
             return;
         }
         
         // UUID.toString() works ok functionally, but we can make it go much faster
         // (by 4x with micro-benchmark)
 
         final char[] ch = new char[36];
         final long msb = value.getMostSignificantBits();
         _appendInt((int) (msb >> 32), ch, 0);
         ch[8] = '-';
         int i = (intmsb;
         _appendShort(i >>> 16, ch, 9);
         ch[13] = '-';
         _appendShort(ich, 14);
         ch[18] = '-';
 
         final long lsb = value.getLeastSignificantBits();
         _appendShort((int) (lsb >>> 48), ch, 19);
         ch[23] = '-';
         _appendShort((int) (lsb >>> 32), ch, 24);
         _appendInt((intlsbch, 28);
 
         jgen.writeString(ch, 0, 36);
     }
 
     private static void _appendInt(int bitschar[] chint offset)
     {
         _appendShort(bits >> 16, choffset);
         _appendShort(bitschoffset+4);
     }
     
     private static void _appendShort(int bitschar[] chint offset)
     {
         ch[offset] = [(bits >> 12) & 0xF];
         ch[++offset] = [(bits >> 8) & 0xF];
         ch[++offset] = [(bits >> 4) & 0xF];
         ch[++offset] = [bits  & 0xF];
 
     }
 
     private final static byte[] _asBytes(UUID uuid)
     {
         byte[] buffer = new byte[16];
         long hi = uuid.getMostSignificantBits();
         long lo = uuid.getLeastSignificantBits();
         _appendInt((int) (hi >> 32), buffer, 0);
         _appendInt((inthibuffer, 4);
         _appendInt((int) (lo >> 32), buffer, 8);
         _appendInt((intlobuffer, 12);
         return buffer;
     }
 
     private final static void _appendInt(int valuebyte[] bufferint offset)
     {
         buffer[offset] = (byte) (value >> 24);
        buffer[++offset] = (byte) (value >> 16);
        buffer[++offset] = (byte) (value >> 8);
        buffer[++offset] = (bytevalue;
    }
New to GrepCode? Check out our FAQ X