Serializer
new Serializer
new Serializer() основной класс, который понадобится для работы с encodexx. Через него происходит кодирование и декодирование шаблона
new Serializer(schema, options?)Параметры
schema- схема, которая описывает сериализуемый объектoptions?- не обязательные настройки, которые добавляют дополнительные проверки соответствия схемы и сериализуемого объектаstrict?: boolean- включает обязательные проверки типов, в случае несоответствия бросает ошибку. По умолчаниюfalseversion?: string- добавляет в итоговый буфер тэг версии. Если при десериализации тэг не совпадет, то выбросит ошибку.resetCursor?: boolean- Автоматически сбрасывает курсор во время сериализации и десериализации. Этот параметр необходим для реализации сложных пользовательских типов и не требуется для обычного использования. По умолчаниюtrue
Использование
Создание
Создайте класс Serializer и передайте в него все необходимые методы
import { Serializer, t } from "encodexx";
const serializer = new Serializer([t.int8], { strict: true, version: "2.32.1",});Как можно заметить, вы можете сериализовать не только объекты, но и массивы и даже отдельные типы.
Так как мы добавили strict настройку, то теперь, если попробовать сериализовать не массив int8 то мы получим ошибку.
serializer.encode([100_000]); // TypeMatchError [TypeError]serializer.encode(["Some string"]); // TypeMatchError [TypeError]Сериализация
Для сериализации используются методы .encode().
.encode(obj: TConvertValueToType<T>, buff?: DataBuffer): DataBuffer;obj- объект, который нужно сериализоватьbuff?- буфер, в который будет записан результат. Если не передан, то создается новый буфер
const obj = Array.from({ length: 100 }, () => Math.floor(Math.random() * 8));
const encoded = serializer.encode(obj);console.log(encoded.buffer);Десериализация
Для десериализации используется метод .decode().
decode(buff: DataBuffer | ArrayBuffer | Uint8Array): TConvertValueToType<T>;buff- буфер, который нужно десериализовать
console.log(serializer.decode(encoded));Проверка объекта на соответствие схеме
Для проверки объекта на соответствие схеме используется метод .guard(obj)
const obj = [1, 2, 3, 4, 5];
serializer.guard(obj); // trueserializer.guard("Some string"); // falseИзменение объекта
Для удобного изменения объекта используется метод .map(). Он принимает функцию, которая принимает текущий объект и возвращает новый объект.
const obj = [1, 2, 3, 4, 5];
const mapped = serializer.map(obj, (value) => { return [...value, 12];});
console.log(serializer.decode(mapped)); // [1, 2, 3, 4, 5, 12]Обратите внимание, что метод .map() возвращает новый объект, а не изменяет исходный.
Типизация
Encodexx предоставляет тип схемы, который вы можете использовать в своих целях. Чтобы его получить можно воспользоваться вспомогательным типом ExtractObj
import { Serializer, t, ExtractObj } from "encodexx";
const serializer = new Serializer({ name: t.or(t.int8, t.string, t.date), age: t.optional(t.uint8),});
type TSchemaType = ExtractObj<typeof serializer>;
TSchemaType; // { name: number | string | Date, age?: number }Tip
Если вы передаете схему в Serializer как переменную, то вы можете столкнутся с ошибкой typescript. Она связана с тем, что encodexx требует, чтобы в массиве указывался только 1 элемент. Чтобы её решить воспользуйтесь типом ArraySingle
import { ArraySingle, t, Serializer } from "encodexx" const schema = { arr: [t.int8] }
new Serializer(schema as ArraySingle<typeof schema>)Serializer.equal(schema1, schema2)
Статический метод Serializer.equal(schema1, schema2): boolean позволяет сравнить 2 схемы.
Caution
Обратите внимание, что последовательность типов в t.or() и t.enumerate() важна
const schema1 = { name: t.str, age: t.uint8,}
const schema2 = { age: t.uint8, name: t.str,}
Serializer.equal(schema1, schema2) // trueconst schema1 = { age: t.or(t.str, t.int8, t.float64),};
const schema2 = { age: t.or(t.float64, t.str, t.int8),};
Serializer.equal(schema1, schema2); // false