Сериализация ключей и значений¶
Формат ключа и значения сообщения задаётся на шине реквизитами КлючСердес и ЗначениеСердес. Этот документ описывает контракт: что обработчик обмена обязан вернуть при выгрузке и что получит приёмная процедура при загрузке.
Ключ и значение обрабатываются одинаково — разными сердесами, но по одним правилам. Как устроены сеансы обмена целиком — см. Отправка данных и Получение данных.
Приём: что получает приёмная процедура¶
Признак null передаётся в сообщении отдельным флагом и проверяется до разбора формата, поэтому он всегда «сильнее» сердеса: сообщение-надгробие (tombstone) приходит как Null при любом сердесе.
| Сердес | Флаг null |
Тело нулевой длины | Обычное тело |
|---|---|---|---|
Игнорировать |
Null |
Неопределено |
Неопределено (тело пропускается) |
Null |
Null |
исключение | исключение |
Строка |
Null |
"" |
Строка (UTF-8) |
ДвоичныеДанные |
Null |
пустые ДвоичныеДанные |
ДвоичныеДанные |
Uuid |
Null |
Неопределено |
УникальныйИдентификатор |
СтруктураJson |
Null |
Неопределено |
Структура |
СоответствиеJson |
Null |
Неопределено |
Соответствие |
Xml |
Null |
Неопределено |
тип определяется содержимым |
Тело нулевой длины — это не отсутствие значения, а пустое значение: отправитель прислал ноль байт, не выставив флаг null. Результат зависит от того, представимо ли пустое тело в формате:
СтрокаиДвоичныеДанные— представимо, возвращается пустое значение того же типа, приём точный;Uuid,СтруктураJson,СоответствиеJson,Xml— непредставимо (UUID это всегда 36 символов, минимальный JSON-объект —{}), поэтому возвращаетсяНеопределено, а не выдуманное значение.
Сердес Null предполагает, что в теме допустимы только сообщения-надгробия; любое непустое сообщение считается ошибкой данных и приводит к исключению.
Отправка: что должен вернуть обработчик¶
Методы СообщениеКлюч и СообщениеЗначение обработки обмена вызываются на каждый выгружаемый объект. Сердес Игнорировать для выгрузки запрещён — это проверяется при записи шины; Null допускается и означает обмен только надгробиями: обработчик обязан возвращать Null.
| Сердес | Допустимый тип значения | Что уходит в Kafka |
|---|---|---|
Строка |
Строка |
UTF-8; пустая строка — тело нулевой длины |
ДвоичныеДанные |
ДвоичныеДанные, БуферДвоичныхДанных |
как есть; пустое значение — тело нулевой длины |
Uuid |
УникальныйИдентификатор |
36 символов, тела нулевой длины не бывает |
СтруктураJson |
Структура, ФиксированнаяСтруктура |
JSON; пустая структура — {} |
СоответствиеJson |
Соответствие, ФиксированноеСоответствие |
JSON; пустое соответствие — {} |
Xml |
любое сериализуемое значение | XML-документ, тела нулевой длины не бывает |
Null |
только Null |
сообщение с флагом null, без тела |
Особые значения:
| Что вернул обработчик | Результат |
|---|---|
Null |
сообщение уходит с флагом null (tombstone) |
Неопределено |
исключение «Не определен ключ сообщения» / «Не определено значение сообщения» |
| значение неподходящего типа | исключение «Некорректный тип исходных данных для сериализации…» |
При сердесе Null любое значение, кроме Null, приводит к исключению: ветки сериализации для этого сердеса нет, и текст ошибки говорит о неподдерживаемом типе сериализации, хотя настройка шины при этом корректна.
Следствия для прикладного кода¶
Сквозная пересылка. Принятое Неопределено нельзя отправить дальше без обработки — при выгрузке оно даст исключение. Без изменений пересылаются Null и значения допустимых типов.
Различение пустого и проигнорированного. Для сердеса Игнорировать результат всегда Неопределено, для остальных Неопределено означает пустое тело. Приёмная процедура знает сердес своей шины, поэтому неоднозначности нет.
Проверка на стороне приёмника. Для форматов, где пустое тело непредставимо, значение приходит либо ожидаемого типа, либо Неопределено, либо Null. Код, присваивающий его типизированному реквизиту, должен обрабатывать два последних случая.
Где это в коде¶
Разбор входящих сообщений — КафкаСервер.ДесериализоватьЗначение. Подготовка исходящих — КафкаСервер.СериализоватьКлючВБуферДвоичныхДанных и КафкаСервер.СериализоватьЗначениеВПотокИЗакрытьЗаписьДанных. Проверки допустимых сердесов для направления обмена — в модуле объекта справочника КафкаШины.