LINUX.ORG.RU

bson (binary json) library для С (не С++)

 ,


0

3

В текущей реализации программы-сервера использую jansson (библиотека работы с json на С - http://www.digip.org/jansson/) для сериализации. Прога отдает главным образом листинги директорий с информацией stat, xattr, acl по каждому объекту в директории. Ну, т.е. это основное ее предназначение и запросы идут в основном по этой части. Соответственно, хотелось бы выжать максимум по скорости из сериализатора. Есть ли смысл перейти на bson? Сам сервер написан на С в стремлении к минимализму и простоте. Поэтому, кто может посоветовать достойную либу для работы с bson на С? Про mongoDB bson-драйвер знаю, но может есть что-то независимое? Советы в плане использования других способов сериализации приветствуются.

Платформа gcc version 4.7.2 (Debian 4.7.2-5)

★★★

Зачем вообще JSON, подойдёт любой простой (свой) бинарный контейнер если получателю не принципиально как получать ответ. Есть ещё всякие вариации вроде protobuf и его сишные реализации, хотя это всё не очень лёгкое.

mashina ★★★★★
()
Ответ на: комментарий от mashina

Проект был изначально запилен именно так, на json. Имеем то, что имеем. Клиент, десериализация на готовых либах тоже как бы..

Ок. Велосипед? Слать прямо структуры типа stat, acl, xattr в бинарном виде? Я как раз думал, что bson тут мог бы помочь. Не?

conalex ★★★
() автор топика

Вариант перейти на protobuf не рассматриваете? Только я не очень хорошо в курсе, как у него с чистым C.

trex6 ★★★★★
()
Ответ на: комментарий от conalex

Слать прямо структуры типа stat, acl, xattr в бинарном виде?

Совсем прямо так не стоит, нужно учитывать endianness у чисел и возможность расширения пакетов.

mashina ★★★★★
()
Ответ на: комментарий от tailgunner

Нет, протокол типа RPC не нужен, речь о сериализации. Думал об RPC, но .. клиент виндовый и как бы поженить его по RPC с линуксом.. теряюсь. Курил исходники самбы в части RPC - ну очень мутно. Потому сериализация/десериализация и json.

По ссылкам тоже посмотрю, интересно, спасиб. Ну, и protobuf тоже покурю. Все же, bson - почему нет?

conalex ★★★
() автор топика
Ответ на: комментарий от mashina

Если дашь пруф на примерчик реализации своего бинарного контейнера, буду премного благодарен. Не сталкивался с этим ранее. Но опять же, речь идет не только о stat и пр. Есть и другие данные, которые тоже нужно гонять, расширяемость была бы очень уместна.

conalex ★★★
() автор топика
Ответ на: комментарий от conalex

Нет, протокол типа RPC не нужен

В capnproto есть формат сообщений (== сериализация), RPC использовать не обязательно.

Думал об RPC, но .. клиент виндовый и как бы поженить его по RPC с линуксом.. теряюсь

Кажется, ты смешиваешь «RPC вообще» (которых много) и конкретный ONC RPC, который в венде.

Все же, bson - почему нет?

Ну ты же приветствовал расширение сознания :)

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Ну ты же приветствовал расширение сознания :)

О да! Вижу, есть где развернуться :)

conalex ★★★
() автор топика

ASN.1 уже советовали?

yoghurt ★★★★★
()
Ответ на: комментарий от conalex

Если дашь пруф на примерчик реализации своего бинарного контейнера, буду премного благодарен. Не сталкивался с этим ранее. Но опять же, речь идет не только о stat и пр. Есть и другие данные, которые тоже нужно гонять, расширяемость была бы очень уместна.

Совем хорошего свободного продуктового примера нет, есть простой пример как это обычно делается своими силами.

mashina ★★★★★
()

Прога отдает главным образом листинги директорий с информацией stat, xattr, acl по каждому объекту в директории

asn,json,xml,der..Люди!! Да вы упоролись - это-ж табличные данные. Элементарного CSV хватит за глаза

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Не очень четко сформулировал, быть может, вначале, но речь идет о штуке, которая по духу ближе к RPC. Т.е. функционал немного шире, нежели просто чтение каталогов.

conalex ★★★
() автор топика
void * buf, * bufit = buf;
//тут хреначишь хеадер,е сли нужен.
do {
//можешь и тут башку для каждого фд организовать.
  *(stat_t *)bufit++ = get_fstat(fd);
  *(xattr_t *)bufit++ = get_xattr(fd);
  *(acl_t *)bufit++ = get_acl(fd);
} while(next_fd());
//next_fd() - какая-то статик обёртка над getdents().
//В гетерах делаешь что-то типа:
stat_t get_fstat(int fd) {
  struct stat....
  //сдесь чистишь, выбираешь нужные поля и прочее.
  return new_stat;
}
//тут жопу фигачишь, если тоже нужна
write(fd, buf, (bufit - buf));//послал.

10строчек кода - это быстрее, надёжнее, проще, компактней любых твоих хренсонов и прочей муры.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.