Serializer
new Serializer
new Serializer()
основной класс, который понадобится для работы с encodexx. Через него происходит кодирование и декодирование шаблона
new Serializer(schema, options?)
Параметры
schema
- схема, которая описывает сериализуемый объектoptions?
- не обязательные настройки, которые добавляют дополнительные проверки соответствия схемы и сериализуемого объектаstrict?: boolean
- включает обязательные проверки типов, в случае несоответствия бросает ошибку. По умолчаниюfalse
version?: 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
Типизация
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