Binary serialization API

Introduction

Mole has a simple serialization API based on Variant. It’s used for converting data types to an array of bytes efficiently. This API is used in the functions get_var and store_var of File as well as the packet APIs for PacketPeer. This format is not used for binary scenes and resources.

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:

Type

Value

0

null

1

bool

2

integer

3

float

4

string

5

vector2

6

rect2

7

vector3

8

matrix32

9

plane

10

quaternion

11

aabb (rect3)

12

matrix3x3

13

transform (matrix 4x3)

14

color

15

image

16

node path

17

rid (unsupported)

18

object (unsupported)

19

input event

20

dictionary

21

array

22

ByteArray

23

IntArray

24

FloatArray

25

StringArray

26

Vector2Array

27

Vector3Array

28

ColorArray

Following this is the actual packet contents, which varies for each type of packet:

0: null

1: bool

Offset

Len

Type

Description

4

4

Integer

0 for False, 1 for True

2: integer

Offset

Len

Type

Description

4

4

Integer

Signed, 32-Bit Integer

3: float

Offset

Len

Type

Description

4

4

Float

IEE 754 32-Bits Float

4: string

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.

5: vector2

Offset

Len

Type

Description

4

4

Float

X Coordinate

8

4

Float

Y Coordinate

6: rect2

Offset

Len

Type

Description

4

4

Float

X Coordinate

8

4

Float

Y Coordinate

12

4

Float

X Size

16

4

Float

Y Size

7: vector3

Offset

Len

Type

Description

4

4

Float

X Coordinate

8

4

Float

Y Coordinate

12

4

Float

Z Coordinate

8: matrix32

Offset

Len

Type

Description

4

4

Float

[0][0]

8

4

Float

[0][1]

12

4

Float

[1][0]

16

4

Float

[1][1]

20

4

Float

[2][0]

24

4

Float

[2][1]

9: plane

Offset

Len

Type

Description

4

4

Float

Normal X

8

4

Float

Normal Y

12

4

Float

Normal Z

16

4

Float

Distance

10: quaternion

Offset

Len

Type

Description

4

4

Float

Imaginary X

8

4

Float

Imaginary Y

12

4

Float

Imaginary Z

16

4

Float

Real W

11: aabb (rect3)

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

12: matrix3x3

Offset

Len

Type

Description

4

4

Float

[0][0]

8

4

Float

[0][1]

12

4

Float

[0][2]

16

4

Float

[1][0]

20

4

Float

[1][1]

24

4

Float

[1][2]

28

4

Float

[2][0]

32

4

Float

[2][1]

36

4

Float

[2][2]

13: transform (matrix 4x3)

Offset

Len

Type

Description

4

4

Float

[0][0]

8

4

Float

[0][1]

12

4

Float

[0][2]

16

4

Float

[1][0]

20

4

Float

[1][1]

24

4

Float

[1][2]

28

4

Float

[2][0]

32

4

Float

[2][1]

36

4

Float

[2][2]

40

4

Float

[3][0]

44

4

Float

[3][1]

48

4

Float

[3][2]

14: color

Offset

Len

Type

Description

4

4

Float

Red (0..1)

8

4

Float

Green (0..1)

12

4

Float

Blue (0..1)

16

4

Float

Alpha (0..1)

15: image

Offset

Len

Type

Description

4

4

Integer

Format (see FORMAT_* in “Image”:class_image

8

4

Integer

Mip-Maps (0 means no mip-maps).

12

4

Integer

Width (Pixels)

16

4

Integer

Height (Pixels)

20

4

Integer

Data Length

24..24+DataLength

1

Byte

Image Data

This field is padded to 4 bytes.

16: node path

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.

17: rid (unsupported)

18: object (unsupported)

19: input event

20: dictionary

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.

21: array

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.

22: class_ByteArray

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.

23: IntArray

Offset

Len

Type

Description

4

4

Integer

Array Length (Integers)

8..8+length*4

4

Integer

32 Bits Signed Integer

24: class_FloatArray

Offset

Len

Type

Description

4

4

Integer

Array Length (Floats)

8..8+length*4

4

Integer

32 Bits IEE 754 Float

25: StringArray

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 is padded to 4 bytes.

26: Vector2Array

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

27: Vector3Array

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

28: ColorArray

Offset

Len

Type

Description

4

4

Integer

Array Length

8..8+length*16

4

Float

Red (0..1)

8..12+length*16

4

Float

Green (0..1)

8..16+length*16

4

Float

Blue (0..1)

8..20+length*16

4

Float

Alpha (0..1)