Двоичная сериализация / десериализация в C ++ и C # - PullRequest
5 голосов
/ 13 января 2011

Я работаю над распределенным приложением, которое состоит из двух компонентов.Один написан на стандартном C ++ ( не управляется C ++ и работает на платформе Linux), а другой написан на C #.Оба взаимодействуют через шину сообщений.

У меня есть ситуация, в которой мне нужно передать объекты из C ++ в приложение C # и для этого мне нужно сериализовать эти объекты в C ++ и десериализовать их в C # (что-токак маршалинг / немаршалинг в .NET).Мне нужно выполнить эту сериализацию в двоичном, а не в XML (по соображениям производительности).

Я использовал Boost.Serialization, чтобы сделать это, когда оба конца были реализованы в C ++, но теперь, когда у меня есть приложение .NETс одной стороны, Boost.Serialization не является жизнеспособным решением.

Я ищу решение, которое позволило бы мне выполнить (де) сериализацию через границы C ++ и .NET, т.е. кросс-платформенная двоичная сериализация .

Я знаю, что могу реализовать код (de) сериализации в DLL C ++ и использовать P/Invoke в приложении .NET, но я хочу сохранить это в качестве крайней меры.

Кроме того, я хочу знать, буду ли я использовать какой-нибудь стандарт, такой как gzip, это будет эффективно?Есть ли другие альтернативы gzip?Каковы плюсы / минусы их?

Спасибо

Ответы [ 3 ]

5 голосов
/ 13 января 2011

Я бы порекомендовал Protocol Buffers, который является собственной библиотекой сериализации Googles.Он имеет сериализаторы .Net, C ++ и Java.Большинство реализаций также довольно быстрые.

http://code.google.com/p/protobuf/

4 голосов
/ 13 января 2011

gzip не напрямую поможет с сериализацией - он просто (попытается) уменьшить поток. Это может помочь или нет, в зависимости от количества дублированных данных в потоке. Для плотных данных с небольшим количеством текста я видел gzip увеличение размер полезной нагрузки.

Лично я бы посмотрел здесь буферы протокола (но я предвзят, поскольку я один из авторов много расширений ). Вы обычно (но не всегда) определяете сообщения на базовом языке (файл .proto) и запускаете инструменты для определения языка для генерации классов. Производительность очень хорошая - ориентируясь на .NET, она может далеко превосходить встроенные сериализаторы ( 1 2 3 )

3 голосов
/ 13 января 2011

Другой возможностью будет Thrift , он имеет еще больше бэкэндов и при необходимости предоставляет значительную часть кода, необходимого для сетевого взаимодействия - на случай, если вы захотите масштабироваться.

Если вы хотите только легкую сериализацию объектов, я бы посмотрел на json.org. Существует множество реализаций C ++ / .NET.

...