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)
- Use MSB as signal bit
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>
