Сериализация сети c ++

Я ищу решение для сериализации пакетов c ++ в сетевом streamе.

Я видел много сообщений здесь, ссылающихся на людей:

  1. ACE

  2. Буферы протокола Google

  3. Повысьте :: Сериализация

  4. Qt :: QDataStream

Мои требования / ограничения:

  1. Решение должно быть не известно о LitteEndian / BigEndian. Архитектура машины x86 / x64 и независимая от платформы.

  2. Нога печати (ОЗУ и ПЗУ) первого 3 решения слишком велики для моей платформы, а четвертая противоречит следующему требованию.

  3. Решение не потребует большого количества кода шаблона (будет 200+ пакет, который будет сериализован).

Спасибо, Коби Меир

Если вы обнаружите, что буферы протокола Google тяжелы (я могу согласиться с этим, потому что скомпилированная библиотека может принимать более 1 МБ), вы можете попробовать облегченную версию protobuf, которая в несколько раз меньше. Его можно включить в файлах * .proto, вставив следующую строку

option optimize_for = LITE_RUNTIME; 

Но если вам нужно решение protobuf с минимальными накладными расходами, я бы пошел с protobuf-c ,
реализация C protobuf. Это будет немного сложнее в использовании, но накладные расходы двоичного кода должны быть минимальными (30-50 КБ). Я знаю, что эта реализация C используется, например, umurmur – голосовой сервер, который отлично работает на встроенных маршрутизаторах ARM и MIPS Linux.

Другая мысль: Сериализовать как текст, разыгрывать на другой стороне.

Мы делаем это много (TCP, UDP, последовательный, другие протоколы). Для такого подхода существует огромный приоритет, например, в роботизированных системах управления, системах управления информацией о лаборатории и в любом другом месте, где полезно «подключение» среди многих поставщиков: все просто отправляют простой текст (ASCII или UTF-8), и это легко читается, легко отлаживается, легко реконструируется и легко ремонтируется / подключается. (Если вы хотите, чтобы он был непрозрачным, вы можете зашифровать свою полезную нагрузку, например, с помощью открытых / закрытых ключей.)

Это соответствует вашим требованиям, предъявляемым к требованиям, предъявляемым к агностикам и другим требованиям платформы. Мы использовали XML, который отлично работает и довольно «стандартен» с некоторой справочной онтологией для того, что вам нужно (возможно, вложенным) значениям «Key = Value», но мы предпочитаем формат INI-стиля, используя «названные разделы «как усложняется. Если вы «вложите» много вещей, вы можете посмотреть на JSON-подобные реализации (это очень просто).

Сильный голос за ASCII, ИМХО.

Wow, ACE, повышайте сериализацию … эти frameworks имеют встроенную сериализацию, но просмотр их для сериализации – это как покупка автомобиля, потому что вам нужен проигрыватель компакт-дисков. SUN / DEC RPC использует формат XDR – очень хорошо описанный в «Сетевом программировании UNIX» Стивена – по существу, это файл LOC header / c 1000 LOC. что вы можете использовать в одиночку. CORBA также использует XDR снизу. Просто найдите «xdr.h» в коде Google – множество реализаций OSS. Если вам все еще нужно что-то сложное, я бы нашел ASN.1 самым всеобъемлющим решением, которое предоставлено немного сложнее, чем это необходимо для большинства приложений, однако составители ASN.1 генерируют компактный код. Он в основном используется телекоммуникационными стопами, телефонами cll, GSM-сообщениями и т. Д. ASN.1 используется для кодирования ключей RSA.

Я думаю, вам придется сворачивать свое окончательное решение, но есть несколько строительных блоков, которые вы можете использовать:

  • Boost :: Spirit (Карма для сериализации, Ци для десериализации)
    это может быть слишком большим для вас, и в этом случае вам придется сворачивать свой собственный для сериализации / десериализации, хотя вы можете использовать идиому Barton-Nackman, чтобы сохранить код читаемым и использовать просто функцию serialize
  • легкий коммуникационный уровень, такой как Arachnida (который вы можете использовать только для связи, не используя свои HTTP-объекты).
    Arachnida основывается на OpenSSL. Если это слишком тяжело для вас, вам действительно нужно катиться самостоятельно.

Незнание / знание маленькой / большой энтианности в значительной степени будет в armх вашего кода сериализации.

Удачи

Я реализовал что-то подобное, используя ту же технику microsoft, что и в MFC . В основном вы реализуете методы в каждом сериализованном classе для сериализации и десериализации того, что вы хотите сохранить из этого classа. Это очень легкий и быстрый.

Вместо classа «archive», который использовался Microsoft, я использовал class бинарного streamа. Мои требования не нуждались в контенте, но было бы тривиально реализовать, если вы реализуете базовый class для сериализации переменных POD.