wiki:KrakenCodec

Kraken Codec

Kraken Codec serializes and deserializes primitive Java objects. It's useful for external data exchange. (e.g. disk, network)

Author

Getting Started

// your object to serialize
Object data;

// encode
ByteBuffer bb = ByteBuffer.allocate(EncodingRule.lengthOf(data));
EncodingRule.encode(bb, data);
bb.flip();

// get bb.array() or bb.get() operations

// decode
Object restored = EncodingRule.decode(bb);

Overview

  • Classic T-L-V encoding (Type / Length / Value)
    • 1 byte for Type
    • N bytes for Length
    • N bytes for Value
  • Variable length number encoding
    • Use MSB as signal bit
      • For example, if you encode 170 (10101010) then it will be encoded as 10000001 00101010
      • MSB 1 means you should read next byte.
      • 5 bytes are required for negative 32 bit value. (32/7 = 4.57 = 5)
      • 10 bytes are required for negative 64 bit value. (64/7 = 9.14 = 10)

Data Types and Byte Formatting

  • Type (Type Number)
    • NULL (0): No length, No data
    • Boolean (1): No length, 1 byte data
    • INT16 (2)
    • INT32 (3)
    • INT64 (4)
    • UTF8 String (5): Length of encoded string and UTF-8 encoded data
    • Date (6): UTC time in milliseconds
    • IPv4 Address (7): No length, 4 bytes data
    • IPv6 Address (8): No length, 16 bytes data
    • Map (9): Length of all encoded key and encoded data (including internal type byte)
    • Array or List (10): Length of all encoded elements (including internal type byte)
    • BLOB (11): Length of byte array, binary data

Methods

// length
EncodingRule.lengthOf(Object value);
EncodingRule.lengthOfNull();
EncodingRule.lengthOfShort(short value);
EncodingRule.lengthOfInt(int value);
EncodingRule.lengthOfLong(long value);
EncodingRule.lengthOfString(String value);
EncodingRule.lengthOfDate(Date value);
EncodingRule.lengthOfIp4(Inet4Address value);
EncodingRule.lengthOfIp6(Inet6Address value);
EncodingRule.lengthOfMap(Map<String, Object> value);
EncodingRule.lengthOfArray(List<?> value);
EncodingRule.lengthOfArray(Object[] value);
EncodingRule.lengthOfBlob(byte[] value);

// encode
EncodingRule.encode(ByteBuffer bb, Object value);
EncodingRule.encodeNull(ByteBuffer bb);
EncodingRule.encodeShort(ByteBuffer bb, short value);
EncodingRule.encodeInt(ByteBuffer bb, int value);
EncodingRule.encodeLong(ByteBuffer bb, long value);
EncodingRule.encodeString(ByteBuffer bb, String value);
EncodingRule.encodeDate(ByteBuffer bb, Date value);
EncodingRule.encodeIp4(ByteBuffer bb, Inet4Address value);
EncodingRule.encodeIp6(ByteBuffer bb, Inet6Address value);
EncodingRule.encodeMap(ByteBuffer bb, Map<String, Object> value);
EncodingRule.encodeArray(ByteBuffer bb, List<?> value);
EncodingRule.encodeArray(ByteBuffer bb, Object[] value);
EncodingRule.encodeBlob(ByteBuffer bb, byte[] value);

// decode
// overloading methods for type-safety
EncodingRule.decode(ByteBuffer bb);
EncodingRule.decodeShort(ByteBuffer bb);
EncodingRule.decodeInt(ByteBuffer bb);
EncodingRule.decodeLong(ByteBuffer bb);
EncodingRule.decodeString(ByteBuffer bb);
EncodingRule.decodeDate(ByteBuffer bb);
EncodingRule.decodeIp4(ByteBuffer bb);
EncodingRule.decodeIp6(ByteBuffer bb);
EncodingRule.decodeMap(ByteBuffer bb);
EncodingRule.decodeArray(ByteBuffer bb);
EncodingRule.decodeBlob(ByteBuffer bb);

Maven POM Configuration

  • Maven Repository:  http://download.krakenapps.org/
    <project>
      <dependencies>
        <dependency>
          <groupId>org.krakenapps</groupId>
          <artifactId>kraken-codec</artifactId>
          <version>1.0.0</version>
        </dependency>
      </dependency>
    </project>
    

Download

Implementation

See also