- 1
- 2
- 3
- 4
- 5
- 6
- 7
case DEBUG_VAR__SIMPLE_TYPE_BOOL:
b = (bool *)(item->ptr);
if (0 != strncmp(var->var_s, "0", 2) && 0 != strncmp(var->var_s, "1", 2)) {
ERROR("Value of %s is not boolean (%s)", name, var->var_s);
return false;
}
*b = (var->var_s[0] == '0') ? 0 : 1;
Все, что вам нужно знать о формате Protobuf.
Предыстория: нужно используя Протобаф переслать значение которое может быть либо строкой, либо числом, либо логической переменной.
Варианты решения:
1. Создать message с опциональными полями - аналог сишного union.
2. Придумать формат в котором в одно поле будет записываться тип пересылаемого значения, а в другое - неведомая херня, которую потом динамически проверять.
Шаблон tagged string?
Конкретно с этим сервером работают еще клиент на Питоне, и вот я сейчас ваяю на Го. Возможно есть какие-то проблемы на стороне Питона, которые не позволяют сделать one-of / optional. После охуительной поддержки и продуманости трифтовских реализаций я уже ничему не удивляюсь.
На правах истроической справки: когда-то давно, когда ЯСОН все еще был только в проекте, прогрессивное человечество спорило о лучшем формате передачи данных в интернете. АМФ все еще был вполне реальной альтернативой. Разница между АМФ и Протобаф принципиально в том, что АМФ содержит метаданные которые позволяют из бинарника восстановить информацию в большинстве случаев без наличия исходников. Протобаф - посчитали что на метаданных можно сэкономить (типичная логика си/сиплюсплюс). А еще они сэкономили на записи длины сообщения. Зато теперь, если формат даже капельку поменялся - можно днями его разгадывать.
Например, типичные оптимизации которые можно сделать в бинарном формате: использовать специальную технику кодирования интов / даблов которая, при условии, что используются только младшие байты будет использовать меньше места (микрооптимизация), или вместо того, чтобы записывать повторяющиеся элементы столько раз, сколько они повторяются, второй и все последующие разы записывать ссылку (рассчитывая на то, что парсер будет создавать ссылки таким же образом как и генератор).
Таким образом АМФ, например может даже выигрывать у Протобаф если нужно посылать много однотипных данных не смотря на то, что посылает метаданные вместе с данными.
Как же заебал этот ламерский пиздеж, ты небось еще и на рест дрочишь, и соап ненавидишь. И си сюда приплел ни к месту. Причем тут си? Выключай уже бредогенератор свой.
Сервер должен уметь во все поддерживаемые версии схемы: клиент запрашивает нужную версию, если она ещё поддерживается, то начинается общение, иначе его посылают.
Обобщённый интерфейс управления всем этим.
Пахнуло Швецией и Эриксоном.
Почему все пишут мою фамилию неправильно?
цын же по правилам
Т.е. ты считаешь, что на цы только одно правило?
Т.е. нужно писать лисицин хвост и царицины глаза?
Гугли суффиксы притяжательных прилагательных.
http://rus.stackexchange.com/questions/115/Окончание-фамилий
Давайте не будем называть его Олегом, я всё время путаю с Олегом Киселёвым.
И не путайте метаданные со схемой: метаданные нужны для того, чтобы убедится в том, что данные были записаны и приняты в соответствии с форматом передачи данных. Схема нужна для того, чтобы описать логику на уровень выше - там где только подмножество допустимых данных можно обработать.
Если пересылать данные без метаданных вообще - то прочитать их вообще нет возможности (т.как никто не знает когда данные закончатся), т.е. как минимум нужна длина (это пример минимальных метаданных).
Но на единицу длины мы имеем факториал единиц вореций пересылаемой информации. Т.е. зная длину мы все равно с вероятностью 1-n/n! можем получить мусор. Если мы, например, добавим еще какие-нибудь метаданные, например, выравнивание, то мы уменьшим процент мусора, и т.д.
Другой пример: апи без метаданных становится доступен злоумышленнику - тут же просто раздолье для ДДОС. С метаданными это на много сложнее.
Это ты про фрейминг так витиевато говоришь? Ответ: не все транспортные протоколы одинаково уёбищны.
Но вообще, про фрейминг это была самая очевидная догадка, так-то я вообще не врубился в тот пост.
- Здра-а-а-а-вствуй, пидар!
Как там ваш пиздотп натуется, кстати?
а премьер министр вообще нихуя знать не должен
А если он сам не знает - должен попросить спецов, чтобы объяснили, чем всё это закончится... Ну это в теории.
Ибо тут они и на мнение опсосов, яндекса и мейлрушечки из принципа положили большой хуй.
Собственно, народ-гной, народ-пидар, народ-хуесос большего и не заслуживает.
Для того, чтобы сделать это более конкретным.
Вот у нас есть сообщение: { a: 1, b: "x", c: true }.
1. Вариант без метаданных: записываем 4 байта int32, 2 байта на строку (с нуль-байтом в конце) и 1 байт на булеан.
1.1. Сервер решил по какой либо причение прислать еще значение 42 после c: true - что делать клиенту? Выбрасывать? Сигналить ошибку? Хранить в надежде на то, что это начало следующего сообщения?
1.2. Сервер забыл, что строки заканчиваются нуль байтом, и записал всего один байт, но за ним шел false, которй тоже представлен нуль байтом. Но т.как сообщения были в массиве, одно за другим, клиент ничего не сказал ему, смолчал, но продолжил работу. Аквалангисты - это хорошо.
2. Если у нас есть минимальные метаданные: длина:
2.1. Аналогично с первым, но мы то знаем, что сервер ошибся.
2.2. Все равно жопа.
> после c: true - что делать клиенту? Выбрасывать? Сигналить ошибку?
> Хранить в надежде на то, что это начало следующего сообщения?
Это, блядь, и называется фрейминг. Иногда его можно позаимствовать из низлежащего транспортного протокола, иногда сначала определяется фрейминг-протокол на уровне аппликейшна, в который затем инкапсулируется всё остальное. Иногда в ход идут твои "метаданные", если уж так хочется смешать мух с котлетами.
Хз. мне просто слове фрейминг не знакомо в этом контексте.
Ну так по-моему неудивительно, что разработчик протоколов, который не знает таких базовых вещей, будет дебажить протоколы неделями. И да, не думаю, что дальше стоит обсуждать эту метапитушню.
Кстати, для protobuf есть модуль для вайршарка, правда 3rd-party, т.к. правильно заметили, что protobuf -- это сериализатор, ограниченно годный для создания именно протоколов.
Еще раз: формат данных и rpc - это ортогональные сущности.
Вод представь что ты десереализируешь данные - откуда ты знаешь, когда они закончатся?
если мы не записываем длину в формате X, а вместо этого записываем длину в формате Y, который включает в себя формат X, тогда нам нужно узнать длину формата Y, и тут возникает проблема: может быть стоит не записывать длину в формате Y, а создать дополнительный формат Z, где мы запишем длину Y - экономия на лицо.
Лишь бы short не перевалил за 8 байтов и '0' оставался непосредственно перед '1'.