Функции сериализации¶
Общий модуль КафкаСервер содержит готовые функции сериализации, которыми пользуется сама подсистема и может пользоваться прикладной код. Они не привязаны к обмену: их можно вызывать откуда угодно, в том числе для задач, не связанных с 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Конец.
Для отправки такого документа подойдёт шина с сердесом значения «Строка».