Перейти к содержанию

Функции сериализации

Общий модуль КафкаСервер содержит готовые функции сериализации, которыми пользуется сама подсистема и может пользоваться прикладной код. Они не привязаны к обмену: их можно вызывать откуда угодно, в том числе для задач, не связанных с Kafka.

JSON

Функция JsonСериализовать(Значение, ПараметрыЗаписиИлиЗаписьJSON = Неопределено, НастройкиСериализацииJSON = Неопределено) Экспорт
Функция JsonДесериализовать(СтрокаИлиЧтениеJSON, КакСоответствие = Неопределено) Экспорт

Обёртки над штатными ЗаписатьJSON и ПрочитатьJSON, избавляющие от возни с объектами чтения и записи:

Строка = КафкаСервер.JsonСериализовать(Данные);
Данные = КафкаСервер.JsonДесериализовать(Строка);
Данные = КафкаСервер.JsonДесериализовать(Строка, Истина);   // объекты JSON как соответствия

Вторым параметром можно передать либо ПараметрыЗаписиJSON (например, с отступами), либо готовый объект ЗаписьJSON — тогда результат пишется в него, а не в строку. То же и при чтении: принимается строка или ЧтениеJSON.

Эти же функции применяются для сердесов «СтруктураJson» и «СоответствиеJson» (см. Сериализация ключей и значений).

XML

Функция XmlСериализовать(Значение, ОтступИлиЗаписьXML = Неопределено) Экспорт
Функция XmlДесериализовать(СтрокаИлиЧтениеXML) Экспорт

Штатная сериализация 1С не умеет записывать структуры, соответствия и таблицы значений. Эти функции закрывают пробел собственным форматом:

Значение Элемент XML
Структура, ФиксированнаяСтруктура struct с элементами structItem и атрибутом key
Соответствие, ФиксированноеСоответствие map с элементами mapItem (mapItemKey, mapItemValue)
Массив, ФиксированныйМассив array с элементами по числу значений
ТаблицаЗначений valueTable с описанием колонок и строками
остальные значения штатная сериализация платформы

Ключом соответствия может быть значение любого сериализуемого типа, а не только строка, — поэтому ключ и значение записываются отдельными элементами. Десериализация восстанавливает исходные типы.

Второй параметр — либо Булево (записывать ли отступы), либо готовый объект ЗаписьXML.

Эти функции применяются для сердеса «Xml»: на приёме тип значения определяется содержимым документа, поэтому переданная структура вернётся структурой, а таблица значений — таблицей значений.

Avro в представлении XML

Набор функций Avro* формирует XML-представление данных Avro: имена элементов соответствуют типам Avro, имя поля записывается атрибутом name. Такой документ можно передать во внешний сериализатор, который превратит его в двоичный формат Avro, — сама подсистема двоичный Avro не формирует.

Функция AvroСериализовать(Значение, Имя = Неопределено, ПространствоИмен = Неопределено, ОтступИлиЗаписьXML = Ложь) Экспорт
Функция AvroДесериализовать(СтрокаИлиЧтениеXML, Имя = Неопределено, ПространствоИмен = Неопределено) Экспорт

Корневым значением может быть только структура — она становится записью Avro (record). Типы полей подбираются автоматически:

Тип 1С Тип Avro
Строка string
Число decimal
Дата timestamp-millis
Булево boolean
УникальныйИдентификатор uuid
ДвоичныеДанные bytes
Структура record
Массив array
Соответствие map
ТаблицаЗначений, РезультатЗапроса массив записей
Неопределено null

Явное управление типами

Автоматический подбор устраивает не всегда: число может быть счётчиком (int), а дата — календарным днём (date). Для таких случаев есть функции записи конкретного типа, которым передаётся объект ЗаписьXML:

AvroЗаписатьNull, AvroЗаписатьBoolean, AvroЗаписатьInt, AvroЗаписатьLong, AvroЗаписатьString, AvroЗаписатьBytes, AvroЗаписатьFixed, AvroЗаписатьDecimal, AvroЗаписатьUuid, AvroЗаписатьDate, AvroЗаписатьTimestampMillis, AvroЗаписатьTimestampMicros, AvroЗаписатьEnum.

Составные значения можно писать потоком, не собирая их в памяти целиком:

ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();

КафкаСервер.AvroЗаписатьRecordНачало(ЗаписьXML, "Заказ", "ru.company.sales");
КафкаСервер.AvroЗаписатьUuid(ЗаписьXML, Идентификатор, "id");
КафкаСервер.AvroЗаписатьDate(ЗаписьXML, ДатаДокумента, "дата");

КафкаСервер.AvroЗаписатьArrayНачало(ЗаписьXML, "строки");
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
    КафкаСервер.AvroЗаписатьRecordНачало(ЗаписьXML);
    КафкаСервер.AvroЗаписатьString(ЗаписьXML, СтрокаТЧ.Номенклатура.Наименование, "номенклатура");
    КафкаСервер.AvroЗаписатьDecimal(ЗаписьXML, СтрокаТЧ.Количество, "количество");
    КафкаСервер.AvroЗаписатьRecordКонец(ЗаписьXML);
КонецЦикла;
КафкаСервер.AvroЗаписатьArrayКонец(ЗаписьXML);

КафкаСервер.AvroЗаписатьRecordКонец(ЗаписьXML);

Значение = ЗаписьXML.Закрыть();

Парные функции есть и для отображений: AvroЗаписатьMapНачало, AvroЗаписатьMapЭлемент, AvroЗаписатьMapКонец.

Для отправки такого документа подойдёт шина с сердесом значения «Строка».