Binary serialization API
Introduction
Godot has a serialization API based on Variant. It's used for
converting data types to an array of bytes efficiently. This API is exposed
via the global :ref:`bytes_to_var() <class_@GlobalScope_method_bytes_to_var>`
and :ref:`var_to_bytes() <class_@GlobalScope_method_var_to_bytes>` functions,
but it is also used in the get_var and store_var methods of
:ref:`class_FileAccess` as well as the packet APIs for :ref:`class_PacketPeer`.
This format is not used for binary scenes and resources.
Full Objects vs Object instance IDs
If a variable is serialized with full_objects = true, then any Objects
contained in the variable will be serialized and included in the result. This
is recursive.
If full_objects = false, then only the instance IDs will be serialized for
any Objects contained in the variable.
Packet specification
The packet is designed to be always padded to 4 bytes. All values are
little-endian-encoded. All packets have a 4-byte header representing an
integer, specifying the type of data.
The lowest value two bytes are used to determine the type, while the highest value
two bytes contain flags:
base_type = val & 0xFFFF;
flags = val >> 16;
| Type |
Value |
| 0 |
null |
| 1 |
bool |
| 2 |
integer |
| 3 |
float |
| 4 |
string |
| 5 |
vector2 |
| 6 |
rect2 |
| 7 |
vector3 |
| 8 |
transform2d |
| 9 |
plane |
| 10 |
quaternion |
| 11 |
aabb |
| 12 |
basis |
| 13 |
transform3d |
| 14 |
color |
| 15 |
node path |
| 16 |
rid |
| 17 |
object |
| 18 |
dictionary |
| 19 |
array |
| 20 |
raw array |
| 21 |
int32 array |
| 22 |
int64 array |
| 23 |
float32 array |
| 24 |
float64 array |
| 25 |
string array |
| 26 |
vector2 array |
| 27 |
vector3 array |
| 28 |
color array |
| 29 |
max |
Following this is the actual packet contents, which varies for each type of
packet. Note that this assumes Godot is compiled with single-precision floats,
which is the default. If Godot was compiled with double-precision floats, the
length of "Float" fields within data structures should be 8, and the offset
should be (offset - 4) * 2 + 4. The "float" type itself always uses double
precision.
0: null
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Integer |
0 for False, 1 for True |
If no flags are set (flags == 0), the integer is sent as a 32 bit integer:
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Integer |
32-bit signed integer |
If flag ENCODE_FLAG_64 is set (flags & 1 == 1), the integer is sent as
a 64-bit integer:
| Offset |
Len |
Type |
Description |
| 4 |
8 |
Integer |
64-bit signed integer |
If no flags are set (flags == 0), the float is sent as a 32 bit single precision:
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Float |
IEEE 754 single-precision float |
If flag ENCODE_FLAG_64 is set (flags & 1 == 1), the float is sent as
a 64-bit double precision number:
| Offset |
Len |
Type |
Description |
| 4 |
8 |
Float |
IEEE 754 double-precision float |
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Integer |
String length (in bytes) |
| 8 |
X |
Bytes |
UTF-8 encoded string |
This field is padded to 4 bytes.
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Float |
X coordinate |
| 8 |
4 |
Float |
Y coordinate |
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Float |
X coordinate |
| 8 |
4 |
Float |
Y coordinate |
| 12 |
4 |
Float |
X size |
| 16 |
4 |
Float |
Y size |
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Float |
X coordinate |
| 8 |
4 |
Float |
Y coordinate |
| 12 |
4 |
Float |
Z coordinate |
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Float |
The X component of the X column vector, accessed via [0][0] |
| 8 |
4 |
Float |
The Y component of the X column vector, accessed via [0][1] |
| 12 |
4 |
Float |
The X component of the Y column vector, accessed via [1][0] |
| 16 |
4 |
Float |
The Y component of the Y column vector, accessed via [1][1] |
| 20 |
4 |
Float |
The X component of the origin vector, accessed via [2][0] |
| 24 |
4 |
Float |
The Y component of the origin vector, accessed via [2][1] |
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Float |
Normal X |
| 8 |
4 |
Float |
Normal Y |
| 12 |
4 |
Float |
Normal Z |
| 16 |
4 |
Float |
Distance |
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Float |
Imaginary X |
| 8 |
4 |
Float |
Imaginary Y |
| 12 |
4 |
Float |
Imaginary Z |
| 16 |
4 |
Float |
Real W |
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Float |
X coordinate |
| 8 |
4 |
Float |
Y coordinate |
| 12 |
4 |
Float |
Z coordinate |
| 16 |
4 |
Float |
X size |
| 20 |
4 |
Float |
Y size |
| 24 |
4 |
Float |
Z size |
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Float |
The X component of the X column vector, accessed via [0][0] |
| 8 |
4 |
Float |
The Y component of the X column vector, accessed via [0][1] |
| 12 |
4 |
Float |
The Z component of the X column vector, accessed via [0][2] |
| 16 |
4 |
Float |
The X component of the Y column vector, accessed via [1][0] |
| 20 |
4 |
Float |
The Y component of the Y column vector, accessed via [1][1] |
| 24 |
4 |
Float |
The Z component of the Y column vector, accessed via [1][2] |
| 28 |
4 |
Float |
The X component of the Z column vector, accessed via [2][0] |
| 32 |
4 |
Float |
The Y component of the Z column vector, accessed via [2][1] |
| 36 |
4 |
Float |
The Z component of the Z column vector, accessed via [2][2] |
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Float |
The X component of the X column vector, accessed via [0][0] |
| 8 |
4 |
Float |
The Y component of the X column vector, accessed via [0][1] |
| 12 |
4 |
Float |
The Z component of the X column vector, accessed via [0][2] |
| 16 |
4 |
Float |
The X component of the Y column vector, accessed via [1][0] |
| 20 |
4 |
Float |
The Y component of the Y column vector, accessed via [1][1] |
| 24 |
4 |
Float |
The Z component of the Y column vector, accessed via [1][2] |
| 28 |
4 |
Float |
The X component of the Z column vector, accessed via [2][0] |
| 32 |
4 |
Float |
The Y component of the Z column vector, accessed via [2][1] |
| 36 |
4 |
Float |
The Z component of the Z column vector, accessed via [2][2] |
| 40 |
4 |
Float |
The X component of the origin vector, accessed via [3][0] |
| 44 |
4 |
Float |
The Y component of the origin vector, accessed via [3][1] |
| 48 |
4 |
Float |
The Z component of the origin vector, accessed via [3][2] |
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Float |
Red (typically 0..1, can be above 1 for overbright colors) |
| 8 |
4 |
Float |
Green (typically 0..1, can be above 1 for overbright colors) |
| 12 |
4 |
Float |
Blue (typically 0..1, can be above 1 for overbright colors) |
| 16 |
4 |
Float |
Alpha (0..1) |
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Integer |
String length, or new format (val&0x80000000!=0 and NameCount=val&0x7FFFFFFF) |
For old format:
| Offset |
Len |
Type |
Description |
| 8 |
X |
Bytes |
UTF-8 encoded string |
Padded to 4 bytes.
For new format:
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Integer |
Sub-name count |
| 8 |
4 |
Integer |
Flags (absolute: val&1 != 0 ) |
For each Name and Sub-Name
| Offset |
Len |
Type |
Description |
| X+0 |
4 |
Integer |
String length |
| X+4 |
X |
Bytes |
UTF-8 encoded string |
Every name string is padded to 4 bytes.
An Object could be serialized in three different ways: as a null value, with
full_objects = false, or with full_objects = true.
A null value
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Integer |
Zero (32-bit signed integer) |
full_objects disabled
| Offset |
Len |
Type |
Description |
| 4 |
8 |
Integer |
The Object instance ID (64-bit signed integer) |
full_objects enabled
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Integer |
Class name (String length) |
| 8 |
X |
Bytes |
Class name (UTF-8 encoded string) |
| X+8 |
4 |
Integer |
The number of properties that are serialized |
For each property:
| Offset |
Len |
Type |
Description |
| Y |
4 |
Integer |
Property name (String length) |
| Y+4 |
Z |
Bytes |
Property name (UTF-8 encoded string) |
| Y+4+Z |
W |
<variable> |
Property value, using this same format |
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Integer |
val&0x7FFFFFFF = elements, val&0x80000000 = shared (bool) |
Then what follows is, for amount of "elements", pairs of key and value,
one after the other, using this same format.
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Integer |
val&0x7FFFFFFF = elements, val&0x80000000 = shared (bool) |
Then what follows is, for amount of "elements", values one after the
other, using this same format.
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Integer |
Array length (Bytes) |
| 8..8+length |
1 |
Byte |
Byte (0..255) |
The array data is padded to 4 bytes.
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Integer |
Array length (Integers) |
| 8..8+length*4 |
4 |
Integer |
32-bit signed integer |
| Offset |
Len |
Type |
Description |
| 4 |
8 |
Integer |
Array length (Integers) |
| 8..8+length*8 |
8 |
Integer |
64-bit signed integer |
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Integer |
Array length (Floats) |
| 8..8+length*4 |
4 |
Integer |
32-bit IEEE 754 single-precision float |
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Integer |
Array length (Floats) |
| 8..8+length*8 |
8 |
Integer |
64-bit IEEE 754 double-precision float |
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Integer |
Array length (Strings) |
For each String:
| Offset |
Len |
Type |
Description |
| X+0 |
4 |
Integer |
String length |
| X+4 |
X |
Bytes |
UTF-8 encoded string |
Every string is padded to 4 bytes.
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Integer |
Array length |
| 8..8+length*8 |
4 |
Float |
X coordinate |
| 8..12+length*8 |
4 |
Float |
Y coordinate |
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Integer |
Array length |
| 8..8+length*12 |
4 |
Float |
X coordinate |
| 8..12+length*12 |
4 |
Float |
Y coordinate |
| 8..16+length*12 |
4 |
Float |
Z coordinate |
| Offset |
Len |
Type |
Description |
| 4 |
4 |
Integer |
Array length |
| 8..8+length*16 |
4 |
Float |
Red (typically 0..1, can be above 1 for overbright colors) |
| 8..12+length*16 |
4 |
Float |
Green (typically 0..1, can be above 1 for overbright colors) |
| 8..16+length*16 |
4 |
Float |
Blue (typically 0..1, can be above 1 for overbright colors) |
| 8..20+length*16 |
4 |
Float |
Alpha (0..1) |