- 二进制序列化API
- 简介
- 包规范
- 0: null
- 1: bool
- 2: int
- 3: float
- 4: String
- 5: Vector2
- 6: Rect2
- 7: Vector3
- 8: Transform2D
- 9: Plane
- 10: Quat
- 11: AABB
- 12: Basis
- 13: Transform
- 14: Color
- 15: NodePath
- 16: RID (暂不支持)
- 17: Object (暂不支持)
- 18: Dictionary
- 19: Array
- 20: PoolByteArray
- 21: PoolIntArray
- 22: PoolRealArray
- 23: PoolStringArray
- 24: PoolVector2Array
- 25: PoolVector3Array
- 26: PoolColorArray
二进制序列化API
简介
Godot有一个基于Variant的简单序列化API.它用于有效地将数据类型转换为字节数组.这个API用于 File 的 get_var
和 store_var
函数,以及 PacketPeer 的包API.这种格式 不 用于二进制场景和资源.
包规范
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;
类型 | 值 |
---|---|
0 | null |
1 | bool |
2 | integer |
3 | (单精度)浮点数 |
4 | 字符串 |
5 | vector2 |
6 | rect2 |
7 | vector3 |
8 | transform2d |
9 | plane |
10 | quat |
11 | aabb |
12 | basis |
13 | 变换 |
14 | 颜色 |
15 | node path |
16 | rid |
17 | object |
18 | 字典 |
19 | 数组 |
20 | raw array |
21 | int array |
22 | real array |
23 | string array |
24 | vector2 array |
25 | vector3 array |
26 | color array |
27 | max |
之后是实际的数据包内容,每种类型的数据包内容都不同.请注意,这是假设Godot是用单精度浮点数编译的,这是默认的.如果Godot是用双精度浮点数编译的,那么数据结构中 “float” 字段的长度应该是8,偏移量应该是 (offset - 4) * 2 + 4
. “float” 类型本身总是使用双精度.
0: null
1: bool
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 4 | Integer | 0 代表 False, 1 代表 True |
2: int
If no flags are set (flags == 0), the integer is sent as a 32 bit integer:
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 4 | Integer | 32位有符号整数 |
If flag ENCODE_FLAG_64
is set (flags & 1 == 1
), the integer is sent as a 64-bit integer:
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 8 | Integer | 64位有符号整数 |
3: float
If no flags are set (flags == 0), the float is sent as a 32 bit single precision:
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 4 | (单精度)浮点数 | 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:
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 8 | (单精度)浮点数 | IEEE 754 double-precision float |
4: String
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 4 | Integer | 字符串长度 (字节) |
8 | X | Bytes | UTF-8编码字符串 |
该字段会被填充成4个字节.
5: Vector2
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 4 | (单精度)浮点数 | X坐标 |
8 | 4 | (单精度)浮点数 | Y坐标 |
6: Rect2
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 4 | (单精度)浮点数 | X坐标 |
8 | 4 | (单精度)浮点数 | Y坐标 |
12 | 4 | (单精度)浮点数 | X尺寸 |
16 | 4 | (单精度)浮点数 | Y尺寸 |
7: Vector3
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 4 | (单精度)浮点数 | X坐标 |
8 | 4 | (单精度)浮点数 | Y坐标 |
12 | 4 | (单精度)浮点数 | Z坐标 |
8: Transform2D
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 4 | (单精度)浮点数 | X列向量的X分量,可通过[0][0]访问 |
8 | 4 | (单精度)浮点数 | X列向量的Y分量,可通过[0][1]访问 |
12 | 4 | (单精度)浮点数 | Y列向量的X分量,可通过[1][0]访问 |
16 | 4 | (单精度)浮点数 | Y列向量的Y分量,可通过[1][1]访问 |
20 | 4 | (单精度)浮点数 | 原始向量的X分量,可通过[2] [0]访问 |
24 | 4 | (单精度)浮点数 | 原始向量的Y分量,可通过[2][1]访问 |
9: Plane
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 4 | (单精度)浮点数 | 法线 X |
8 | 4 | (单精度)浮点数 | 法线 Y |
12 | 4 | (单精度)浮点数 | 法线 Z |
16 | 4 | (单精度)浮点数 | 距离 |
10: Quat
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 4 | (单精度)浮点数 | 虚数X |
8 | 4 | (单精度)浮点数 | 虚数Y |
12 | 4 | (单精度)浮点数 | 虚数Z |
16 | 4 | (单精度)浮点数 | 实数W |
11: AABB
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 4 | (单精度)浮点数 | X坐标 |
8 | 4 | (单精度)浮点数 | Y坐标 |
12 | 4 | (单精度)浮点数 | Z坐标 |
16 | 4 | (单精度)浮点数 | X尺寸 |
20 | 4 | (单精度)浮点数 | Y尺寸 |
24 | 4 | (单精度)浮点数 | Z尺寸 |
12: Basis
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 4 | (单精度)浮点数 | X列向量的X分量,可通过[0][0]访问 |
8 | 4 | (单精度)浮点数 | X列向量的Y分量,可通过[0][1]访问 |
12 | 4 | (单精度)浮点数 | X列向量的Z分量,可通过[0][2]访问 |
16 | 4 | (单精度)浮点数 | Y列向量的X分量,可通过[1][0]访问 |
20 | 4 | (单精度)浮点数 | Y列向量的Y分量,可通过[1][1]访问 |
24 | 4 | (单精度)浮点数 | Y列向量的Z分量,可通过[1][2]访问 |
28 | 4 | (单精度)浮点数 | Z列向量的X分量,可通过[2][0]访问 |
32 | 4 | (单精度)浮点数 | Z列向量的Y分量,可通过[2][1]访问 |
36 | 4 | (单精度)浮点数 | Z列向量的Z分量,可通过[2][2]访问 |
13: Transform
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 4 | (单精度)浮点数 | X列向量的X分量,可通过[0][0]访问 |
8 | 4 | (单精度)浮点数 | X列向量的Y分量,可通过[0][1]访问 |
12 | 4 | (单精度)浮点数 | X列向量的Z分量,可通过[0][2]访问 |
16 | 4 | (单精度)浮点数 | Y列向量的X分量,可通过[1][0]访问 |
20 | 4 | (单精度)浮点数 | Y列向量的Y分量,可通过[1][1]访问 |
24 | 4 | (单精度)浮点数 | Y列向量的Z分量,可通过[1][2]访问 |
28 | 4 | (单精度)浮点数 | Z列向量的X分量,可通过[2][0]访问 |
32 | 4 | (单精度)浮点数 | Z列向量的Y分量,可通过[2][1]访问 |
36 | 4 | (单精度)浮点数 | Z列向量的Z分量,可通过[2][2]访问 |
40 | 4 | (单精度)浮点数 | 原始向量的X分量,可通过[3][0]访问 |
44 | 4 | (单精度)浮点数 | 原点向量的Y分量,可通过[3][1]访问 |
48 | 4 | (单精度)浮点数 | 原点向量的Z分量,可通过[3][2]访问 |
14: Color
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 4 | (单精度)浮点数 | 红色(一般为0…1,对于过亮的颜色可大于1) |
8 | 4 | (单精度)浮点数 | 绿色(一般为0…1,对于过亮的颜色可大于1) |
12 | 4 | (单精度)浮点数 | 蓝色(一般为0…1,对于过亮的颜色可大于1) |
16 | 4 | (单精度)浮点数 | 透明通道 (0..1) |
15: NodePath
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 4 | Integer | 字符串长度,或新格式(val&0x80000000!=0 and NameCount=val&0x7FFFFFFF) |
对于旧格式:
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
8 | X | Bytes | UTF-8编码字符串 |
填充到4个字节.
对于新格式:
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 4 | Integer | 子名称数 |
8 | 4 | Integer | 标志 (absolute: val&1 != 0 ) |
对于每个名称和子名称
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
X+0 | 4 | Integer | 字符串长度 |
X+4 | X | Bytes | UTF-8编码字符串 |
每个名称字符串都会填充到4个字节.
16: RID (暂不支持)
17: Object (暂不支持)
18: Dictionary
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 4 | Integer | val&0x7FFFFFFF = elements, val&0x80000000 = shared (bool) |
然后,对于``elements``的数量,使用相同的格式,一个接一个地使用密钥和值对.
19: Array
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 4 | Integer | val&0x7FFFFFFF = elements, val&0x80000000 = shared (bool) |
然后,对于``elements``的数量,使用相同的格式一个接一个地输出值.
20: PoolByteArray
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 4 | Integer | 数组长度(字节) |
8..8+长度 | 1 | Byte | 字节 (0..255) |
数组数据填充为4个字节.
21: PoolIntArray
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 4 | Integer | 数组长度(整数) |
8..8+长度*4 | 4 | Integer | 32位有符号整数 |
22: PoolRealArray
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 4 | Integer | 数组长度(浮点数) |
8..8+长度*4 | 4 | Integer | 32-bits IEEE 754 float |
23: PoolStringArray
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 4 | Integer | 数组长度(字符串) |
对于每个字符串:
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
X+0 | 4 | Integer | 字符串长度 |
X+4 | X | Bytes | UTF-8编码字符串 |
每个字符串填充为4个字节.
24: PoolVector2Array
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 4 | Integer | 数组长度 |
8..8+长度8 | 4 | (单精度)浮点数 | X坐标 |
8..12+长度8 | 4 | (单精度)浮点数 | Y坐标 |
25: PoolVector3Array
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 4 | Integer | 数组长度 |
8..8+长度12 | 4 | (单精度)浮点数 | X坐标 |
8..12+长度12 | 4 | (单精度)浮点数 | Y坐标 |
8..16+长度*12 | 4 | (单精度)浮点数 | Z坐标 |
26: PoolColorArray
偏移量 | 长度 | 类型 | 描述 |
---|---|---|---|
4 | 4 | Integer | 数组长度 |
8..8+长度16 | 4 | (单精度)浮点数 | 红色(一般为0…1,对于过亮的颜色可大于1) |
8..12+长度16 | 4 | (单精度)浮点数 | 绿色(一般为0…1,对于过亮的颜色可大于1) |
8..16+长度16 | 4 | (单精度)浮点数 | 蓝色(一般为0…1,对于过亮的颜色可大于1) |
8..20+长度16 | 4 | (单精度)浮点数 | 透明通道 (0..1) |