You are viewing an old version of this page. View the current version.
Compare with Current
View Page History
« Previous
Version 13
Next »
Purpose
The purpose of this document to describe serialization of a various data type which Geode understands.
Data Types
Geode supports all the Java primitive data types. Custom Java object can be serialized through Geode PdxSerializable and DataSerializable interfaces. The Application can attach its data serializer through Geode DataSerializer and Geode PdxSerializer interface. Using Geode, the application can also serialize arrays of primitive Java types and Java collections. It also understands the Java Serializable.
In Geode, every supported data type is associated with type Id. Type Id is represented by one byte. To serialize any date type Geode first writes the typeId. Then it writes the length of serialized byte for variable types. For fixed data types it just writes those bytes in the Big Indian byte order.
Data Type | Type Id | Value | Serialized Bytes | Description |
---|
Null | 41 = 0x29 | null | | |
Boolean | 53 = 0x35 | true | | |
Character | 54 = 0x36 | 'a' | | |
Byte | 55 = 0x37 | 1 | | |
Short | 56 = 0x38 | 1000 | | |
Integer | 57 = 0x39 | 1000 | typeId | 0x39 |
---|
bytes | 0x00 0x00 0x03 0xE8 |
| |
Long | 58 = 0x3A | 1000 | typeId | 0x3A |
---|
bytes | 0x00 0x00 0x00 0x00 0x00 0x00 0x03 0xE8 |
| |
Float | 59 = 0x3B | 1000f | typeId | 0x3B |
---|
bytes | 0x44 0x7A 0x00 0x00 |
| |
Double | 60 = 0x3C | 1000d |
typeId | 0x3C |
---|
bytes | 0x40 0xF1 0x40 0x00 0x00 0x00 0x00 0x00 |
| |
ASCII_STRING | 87 = 0x57 | "hello" | typeid | 0x57 |
---|
len | 0x00 0x05 | bytes | 0x68 0x65 0x40 0x40 0x6F |
| This represents ASCII string with maximum length 0xFFFF. |
UTF_STRING | 42 = 0x2A | | | This represents UTF string with maximum length 0xFFFF. |
HUGE_ASCII_STRING | 88 = 0x58 | | | This represents ASCII string with length greater than 0xFFFF. |
HUGE_UTF_STRING | 89 = 0x59 | | | This represents UTF string with length greater than 0xFFFF. |
byte[] | 46 = 0x2E | byte[] {1,2} | typeId | 0x2E |
---|
len | 0x02 | bytes | 0x01 0x02 |
| |
short[] | 47 = 0x2F | short[] {1,2} | typeId | 0x2F |
---|
len | 0x02 | bytes | 0x00 0x01 0x00 0x02 |
| |
int[] | 48 = 0x30 | int[] {1,2} | typeId | 0x30 |
---|
len | 0x02 | bytes | 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x02 |
| |
long[] | 49 = 0x31 | long[] {1} | typeId | 0x31 |
---|
len | 0x01 | bytes | 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01 |
| |
float[] | 50 = 0x32 | float[] {2.0f} | typeId | 0x32 |
---|
len | 0x01 | bytes | 0x40 0x00 0x00 0x00 |
| |
double[] | 51 = 0x33 | double[] {2.0d} | typeId | 0x33 |
---|
len | 0x01 | bytes | 0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00 |
| |
string[] | 64 = 0x40 | String[]{"hello", "world"} | typeId | 0x40 |
---|
len | 0x02 | "hello" bytes | 0x57 - ASCII_STRING 0x00 0x05 0x68 0x65 0x6c 0x6c 0x6f | "world" bytes | 0x57 - ASCII_STRING 0x00 0x05 - len 0x77 0x6f 0x72 0x6c 0x64
|
| |
Map | 67 = 0x43 | Map s = new HashMap<>(); s.put("hello", "world") | typeId | 0x43 |
---|
len | 0x01 | "hello" bytes | 0x57 - ASCII_STRING 0x00 0x05 0x68 0x65 0x6c 0x6c 0x6f | "world" bytes | 0x57 - ASCII_STRING 0x00 0x05 - len 0x77 0x6f 0x72 0x6c 0x64 |
| |
Set | 66 = 0x42 | Set s = new HashSet(); s.add("hello"); s.add("world");
| typeId | 0x42 |
---|
len | 0x02 | "hello" bytes | 0x57 - ASCII_STRING 0x00 0x05 0x68 0x65 0x6c 0x6c 0x6f | "world" bytes | 0x57 - ASCII_STRING 0x00 0x05 - len 0x77 0x6f 0x72 0x6c 0x64 |
| |
List | 10 = 0x0a | List s = new LinkedList(); s.add("hello"); s.add("world"); | typeId | 0x0a |
---|
len | 0x02 | "hello" bytes | 0x57 - ASCII_STRING 0x00 0x05 0x68 0x65 0x6c 0x6c 0x6f | "world" bytes | 0x57 - ASCII_STRING 0x00 0x05 - len 0x77 0x6f 0x72 0x6c 0x64 |
| |
ArrayList | 65=0x41 | List s = new ArrayList(); s.add("hello"); s.add("world"); | typeId | 0x41 |
---|
len | 0x02 | "hello" bytes | 0x57 - ASCII_STRING 0x00 0x05 0x68 0x65 0x6c 0x6c 0x6f | "world" bytes | 0x57 - ASCII_STRING 0x00 0x05 - len 0x77 0x6f 0x72 0x6c 0x64 |
| |
PDX_SERIALIZATION | 93=0x5D | | | Java Object can implement PdxSerializable interface to serialize data in pdx format |
PDX_SERIALIZER | | | | The application can implement PdxSerializer interface and then install with geode cache to serialize data in pdx format. |
DATA_SERIALIZATION | | | | Java Object can implement DataSerializable interface to serialize data. |
USER_SERIALIZATION | | | | The application can implement DataSerializer interface and then install with geode cache to serialize data. |
Calculate Collection/Array Size
Geode calculate the size of collection or Array in following way
Write Array Length function | Read Array Length Function |
---|
public static final byte NULL_ARRAY = -1; // array is null
/**
* @since GemFire 5.7
*/
private static final byte SHORT_ARRAY_LEN = -2; // array len encoded as unsigned short in next 2
// bytes
/**
* @since GemFire 5.7
*/
public static final byte INT_ARRAY_LEN = -3; // array len encoded as int in next 4 bytes
private static final int MAX_BYTE_ARRAY_LEN = ((byte) -4) & 0xFF;
public static void writeArrayLength(int len, DataOutput out) throws IOException {
if (len == -1) {
out.writeByte(NULL_ARRAY);
} else if (len <= MAX_BYTE_ARRAY_LEN) {
out.writeByte(len);
} else if (len <= 0xFFFF) {
out.writeByte(SHORT_ARRAY_LEN);
out.writeShort(len);
} else {
out.writeByte(INT_ARRAY_LEN);
out.writeInt(len);
}
}
|
public static int readArrayLength(DataInput in) throws IOException {
byte code = in.readByte();
if (code == NULL_ARRAY) {
return -1;
} else {
int result = ubyteToInt(code);
if (result > MAX_BYTE_ARRAY_LEN) {
if (code == SHORT_ARRAY_LEN) {
result = in.readUnsignedShort();
} else if (code == INT_ARRAY_LEN) {
result = in.readInt();
} else {
throw new IllegalStateException("unexpected array length code=" + code);
}
}
return result;
}
}
|