Work in progress
The content of this page was not yet updated for Godot
4.4
and may be outdated. If you know how to improve this page or you can confirm
that it's up to date, feel free to open a pull request.
API двоичной сериализации
Введение
Godot имеет API сериализации, основанный на Variant. Он используется для эффективного преобразования типов данных в массив байтов. Этот API доступен через глобальные функции bytes_to_var() и var_to_bytes(), а также в методах get_var и store_var класса FileAccess, а также в пакетных API для PacketPeer. Этот формат не используется для двоичных сцен и ресурсов.
Полные Objects vs Object instance IDs
Если переменная сериализована с full_objects = true, то все объекты, содержащиеся в этой переменной, будут сериализованы и включены в результат. Это рекурсивно.
Если full_objects = false, то для всех объектов, содержащихся в переменной, будут сериализованы только идентификаторы экземпляров.
Пакетная сериализация
Пакет спроектирован всегда укладываться в 4 байта. Все значения закодированы от младшего к старшему(little endian). Все пакеты имеют целочисленный заголовок в 4 байта, определяющий тип данных.
Два байта с наименьшим значением используются для определения типа, а два байта с наибольшим значением содержат флаги:
base_type = val & 0xFFFF;
flags = val >> 16;
Тип |
Значение |
|---|---|
0 |
null |
1 |
bool |
2 |
integer |
3 |
float |
4 |
string |
5 |
vector2 |
6 |
rеct2 |
7 |
vector3 |
8 |
trаnsform2d |
9 |
plаne |
10 |
quaternion (кватернион) |
11 |
аabb |
12 |
bаsis |
13 |
transform3d |
14 |
color (цвет) |
15 |
node path (путь к узлу) |
16 |
rіd |
17 |
object (объект) |
18 |
dictionary (словарь) |
19 |
array (массив) |
20 |
raw array (необработанный массив) |
21 |
int32 array |
22 |
int64 array |
23 |
float32 array |
24 |
float64 array |
25 |
строковый массив |
26 |
vector2 массив |
27 |
vector3 массив |
28 |
цветовая матрица |
29 |
max |
После этого следует фактическое содержимое пакета, которое различается для каждого типа пакета. Обратите внимание, что здесь предполагается, что Godot скомпилирован с плавающей точкой одинарной точности, что является значением по умолчанию. Если Godot был скомпилирован с плавающей точкой двойной точности, длина полей "Float" в структурах данных должна быть 8, а смещение должно быть (смещение - 4) * 2 + 4. Сам тип "float" всегда использует двойную точность.
0: null
1: bool
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Integer |
0 для False, 1 для True |
2: int
Если флаги не установлены (flags == 0), целое число передается как 32-битное целое число:
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Integer |
32-битное знаковое целое число |
Если установлен флаг ENCODE_FLAG_64 (flags & 1 == 1), целое число передается как 64-битное целое число:
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
8 |
Integer |
64-битное знаковое целое число |
3: float
Если флаги не установлены (flags == 0), то float передается как 32-битное число одинарной точности:
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Float |
IEEE 754 одноточечное число с плавающей запятой |
Если установлен флаг ENCODE_FLAG_64 (flags & 1 == 1), то float передается как 64-битное число двойной точности:
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
8 |
Float |
IЕEE 754 32-Битное Число с плавающей точкой |
4: String
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Integer |
Длина строки (в Байтах) |
8 |
X |
Байт |
Строка в кодировке UTF-8 |
Это поле укладывается в 4 байта.
5: Vector2
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Float |
Координата по оси X |
8 |
4 |
Float |
Координата по оси Y |
6: Rect2
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Float |
Координата по оси X |
8 |
4 |
Float |
Координата по оси Y |
12 |
4 |
Float |
размер Х |
16 |
4 |
Float |
Размер Y |
7: Vector3
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Float |
Координата по оси X |
8 |
4 |
Float |
Координата по оси Y |
12 |
4 |
Float |
Координата по оси Z |
8: Transform2D
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Float |
Компонент X вектора столбца X, доступ к которому осуществляется через [0][0] |
8 |
4 |
Float |
Компонент Y вектора столбца X, доступ к которому осуществляется через [0][1] |
12 |
4 |
Float |
Компонент X вектора столбца Y, доступ к которому осуществляется через [1][0] |
16 |
4 |
Float |
Компонент Y вектора столбца Y, доступ к которому осуществляется через [1][1] |
20 |
4 |
Float |
Компонент X исходного вектора, доступ к которому осуществляется через [2][0] |
24 |
4 |
Float |
Компонент Y исходного вектора, доступ к которому осуществляется через [2][1] |
9: Plane
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Float |
Нормаль по оси X |
8 |
4 |
Float |
Нормаль по оси Y |
12 |
4 |
Float |
Нормаль по оси Z |
16 |
4 |
Float |
Расстояние |
10: Quaternion
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Float |
Воображаемое значение по оси X |
8 |
4 |
Float |
Воображаемое значение по оси Y |
12 |
4 |
Float |
Воображаемое значение по оси Z |
16 |
4 |
Float |
Настоящее значение по оси W |
11: AABB
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Float |
Координата по оси X |
8 |
4 |
Float |
Координата по оси Y |
12 |
4 |
Float |
Координата по оси Z |
16 |
4 |
Float |
размер Х |
20 |
4 |
Float |
Размер Y |
24 |
4 |
Float |
Размер Z |
12: Basis
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Float |
Компонент X вектора столбца X, доступ к которому осуществляется через [0][0] |
8 |
4 |
Float |
Компонент Y вектора столбца X, доступ к которому осуществляется через [0][1] |
12 |
4 |
Float |
Компонент Z вектора столбца X, доступ к которому осуществляется через [0][2] |
16 |
4 |
Float |
Компонент X вектора столбца Y, доступ к которому осуществляется через [1][0] |
20 |
4 |
Float |
Компонент Y вектора столбца Y, доступ к которому осуществляется через [1][1] |
24 |
4 |
Float |
Компонент Z вектора столбца Y, доступ к которому осуществляется через [1][2] |
28 |
4 |
Float |
Компонент X вектора столбца Z, доступ к которому осуществляется через [2][0] |
32 |
4 |
Float |
Компонент Y вектора столбца Z, доступ к которому осуществляется через [2][1] |
36 |
4 |
Float |
Компонент Z вектора столбца Z, доступ к которому осуществляется через [2][2] |
13: Transform3D
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Float |
Компонент X вектора столбца X, доступ к которому осуществляется через [0][0] |
8 |
4 |
Float |
Компонент Y вектора столбца X, доступ к которому осуществляется через [0][1] |
12 |
4 |
Float |
Компонент Z вектора столбца X, доступ к которому осуществляется через [0][2] |
16 |
4 |
Float |
Компонент X вектора столбца Y, доступ к которому осуществляется через [1][0] |
20 |
4 |
Float |
Компонент Y вектора столбца Y, доступ к которому осуществляется через [1][1] |
24 |
4 |
Float |
Компонент Z вектора столбца Y, доступ к которому осуществляется через [1][2] |
28 |
4 |
Float |
Компонент X вектора столбца Z, доступ к которому осуществляется через [2][0] |
32 |
4 |
Float |
Компонент Y вектора столбца Z, доступ к которому осуществляется через [2][1] |
36 |
4 |
Float |
Компонент Z вектора столбца Z, доступ к которому осуществляется через [2][2] |
40 |
4 |
Float |
Компонент X исходного вектора, доступ к которому осуществляется через [3][0] |
44 |
4 |
Float |
Компонент Y исходного вектора, доступ к которому осуществляется через [3][1] |
48 |
4 |
Float |
Компонент Z исходного вектора, доступ к которому осуществляется через [3][2] |
14: Color
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Float |
Красный (обычно 0..1, может быть больше 1 для особо ярких цветов) |
8 |
4 |
Float |
Зеленый (обычно 0..1, может быть больше 1 для особо ярких цветов) |
12 |
4 |
Float |
Синий (обычно 0..1, может быть больше 1 для особо ярких цветов) |
16 |
4 |
Float |
Альфа (0..1) |
15: NodePath
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Integer |
Длина строки или новый формат (val&0x80000000!=0 и NameCount=val&0x7FFFFFFF) |
Для старого формата:
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
8 |
X |
Байт |
Строка в кодировке UTF-8 |
Укладывается в 4 байта.
Для нового формата:
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Integer |
Количество Под-Имён |
8 |
4 |
Integer |
Флаги (абсолютные: val&1 != 0 ) |
Для каждого Имени и Под-Имени
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
X+0 |
4 |
Integer |
Длина строки |
X+4 |
X |
Байт |
Строка в кодировке UTF-8 |
Каждая строка имени уложена в 4 байта.
16: RID (Не поддерживается)
17: Object
Объект может быть сериализован тремя различными способами: как нулевое значение, с full_objects = false или с full_objects = true.
A null value (Нулевое значение)
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Integer |
Zero (32-битное знаковое целое число) |
full_objects отключены
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
8 |
Integer |
ID экземпляра объекта (64-битное знаковое целое число) |
full_objects включен
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Integer |
Имя класса (Длина строки) |
8 |
X |
Байт |
Class name (строка в кодировке UTF-8) |
X+8 |
4 |
Integer |
Количество сериализованных свойств |
Для каждого объекта недвижимости:
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
Y |
4 |
Integer |
Имя свойства (Длина строки) |
Y+4 |
Z |
Байт |
Имя свойства (Строка в кодировке UTF-8) |
Y+4+Z |
W |
<variable> |
Стоимость недвижимости, используя тот же формат |
Примечание
Включены не все свойства. Сериализуются только свойства, настроенные с установленным флагом PROPERTY_USAGE_STORAGE. Вы можете добавить новый флаг использования к свойству, переопределив метод _get_property_list в вашем классе. Вы также можете проверить, как настроено использование свойства, вызвав Object._get_property_list. См. PropertyUsageFlags для получения информации о возможных флагах использования.
18: Dictionary
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Integer |
val&0x7FFFFFFF = элементы, val&0x80000000 = общий (bool) |
Из этого следует, что количество "elements", пар ключ/значение, один за другим, использует тот же формат.
19: Array
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Integer |
val&0x7FFFFFFF = элементы, val&0x80000000 = общий (bool) |
Из этого следует, что количество "elements", значений одним за другим, использует тот же формат.
20: PackedByteArray
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Integer |
Длина Массива (в Байтах) |
8..8+длина |
1 |
Байт |
Байт (0..255) |
Данные массива укладываются в 4 байта.
21: PackedInt32Array
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Integer |
Длина Массива (Целые числа) |
8..8+длина*4 |
4 |
Integer |
32-битное знаковое целое число |
22: PackedInt64Array
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
8 |
Integer |
Длина Массива (Целые числа) |
8..8+длина*8 |
8 |
Integer |
64-битное знаковое целое число |
23: PackedFloat32Array
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Integer |
Длина массива (Floats) |
8..8+длина*4 |
4 |
Integer |
32-bit IEEE 754 одинарной точности float |
24: PackedFloat64Array
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Integer |
Длина массива (Floats) |
8..8+длина*8 |
8 |
Integer |
64-bit IEEE 754 двойной точности float |
25: PackedStringArray
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Integer |
Длина массива (Strings) |
Для каждой Строки:
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
X+0 |
4 |
Integer |
Длина строки |
X+4 |
X |
Байт |
Строка в кодировке UTF-8 |
Каждая строка укладывается в 4 байта.
26: PackedVector2Array
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Integer |
Array length (Длина Массива) |
8..8+длина*8 |
4 |
Float |
Координата по оси X |
8..12+длина*8 |
4 |
Float |
Координата по оси Y |
27: PackedVector3Array
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Integer |
Array length (Длина Массива) |
8..8+длина*12 |
4 |
Float |
Координата по оси X |
8..12+длина*12 |
4 |
Float |
Координата по оси Y |
8..16+длина*12 |
4 |
Float |
Координата по оси Z |
28: PackedColorArray
Отступ |
Длина |
Тип |
Описание |
|---|---|---|---|
4 |
4 |
Integer |
Array length (Длина Массива) |
8..8+длина*16 |
4 |
Float |
Красный (обычно 0..1, может быть больше 1 для особо ярких цветов) |
8..12+длина*16 |
4 |
Float |
Зеленый (обычно 0..1, может быть больше 1 для особо ярких цветов) |
8..16+длина*16 |
4 |
Float |
Синий (обычно 0..1, может быть больше 1 для особо ярких цветов) |
8..20+длина*16 |
4 |
Float |
Альфа (0..1) |