> -- Сергей Губанов писал(а):
> Причём сишники багов боятся так сильно, что если и переходят к бинарному протоколу, то на всякий пожарный случай перед записыванием каждой переменной ещё записывают лишний байт с числовым значением её типа. И это не смотря на то, что код сериализаторов/десериализаторов зачастую генерят автоматически
Это делается для последующего расширения формата. Придает гибкость. Стандартно же -- tlv (type, length, value). На type легко вешается обработчик. Получаем эдакий SAX для бинарного формата. Очень удобно. Расширяемо. Также следует учесть, что если протокол вдруг поменялся, и вы нагенерили новых сериализаторов/десериализаторов, это не значит что в системе сразу все компоненты перешли на новый протокол.

Кроме того, частенько туда пишут не тип, а например как в google protobuf'e, номер поля (ну, можно считать что каждое поле имеет свой уникальный тип). Что делается опять таки для расширизмов. Например благодаря этому механизму реализованы опциональные поля (да, если опциональное поле в данном сообщении отсутствует (не нужно) то оно и небудет передано/сериализовано). Опять же -- весьма удобно.

Кстати, а при чем тут именно сишники?

Да, на счет текстовых форматов/протоколов. Когда у производительность не критична (а она очень часто не критична), то при прочих равных следует выбирать тот формат, который можно будет обработать максимально широким спектром утилит (проанализировать, посмотреть, отредактировать). Таковой  формат -- всегда текстовый формат, причем ASCII. Написание своих тулзей для просмотра своего же бинарного формата черевато ошибками. Смотришь через эту тулзень на данные, видишь хрень, и непонятно из за чего хрень -- толи это данные не правильные, толи это в тулзени бага. В общем, нужны очень веские основания для отказа от моря стандартный утилит (grep, awk, cat and so on) для обработки данных в пользу своего велосипеда.