Skip to main content

Serializer

new Serializer

new Serializer() основной класс, который понадобится для работы с encodexx. Через него происходит кодирование и декодирование шаблона

index.ts
new Serializer(schema, options?)

Параметры

  • schema - схема, которая описывает сериализуемый объект
  • options? - не обязательные настройки, которые добавляют дополнительные проверки соответствия схемы и сериализуемого объекта
    • strict?: boolean - включает обязательные проверки типов, в случае несоответствия бросает ошибку. По умолчанию false
    • version?: string - добавляет в итоговый буфер тэг версии. Если при десериализации тэг не совпадет, то выбросит ошибку.
    • resetCursor?: boolean - Автоматически сбрасывает курсор во время сериализации и десериализации. Этот параметр необходим для реализации сложных пользовательских типов и не требуется для обычного использования. По умолчанию true

Использование

Создание

Создайте класс Serializer и передайте в него все необходимые методы

index.ts
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) // true
serializer.guard("Some string") // false

Типизация

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) // true
const 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