Сериализация в C ++, а затем десериализация в C #? - PullRequest
11 голосов
/ 07 апреля 2009

Существует ли простой способ сериализации данных в c ++ (либо в xml, либо в двоичном формате), а затем десериализации данных в C #?

Я работаю с некоторыми удаленными WINNT-машинами, которые не запускают .Net. Мое серверное приложение написано полностью на C #, поэтому я хочу простой способ обмена простыми данными (в основном пары ключ-значение, и, возможно, некоторое представление набора результатов SQL). Я полагаю, что лучшим способом будет запись данных в xml в некотором предопределенном формате на клиенте, передача файла xml на мой сервер и использование оболочки C # для чтения xml в пригодный для использования объект c #.

Клиент и сервер обмениваются данными по tcp-соединению, и я действительно хочу сериализировать данные в памяти на клиенте, передавать двоичные данные через сокет в поток памяти ac #, который я могу десериализовать в объект ac # (исключая создание файлов, передачу и т. д.), но я не думаю, что что-то подобное существует. Не стесняйтесь просветить меня.

Редактировать

Я знаю, что могу создать структуру в приложении c ++ и определить ее в c # и передавать данные таким образом, но в моей голове такое чувство, что я ограничиваю то, что можно отправить. Я должен был бы установить предопределенные размеры для объектов и т. Д.

Ответы [ 7 ]

8 голосов
/ 07 апреля 2009

Буферы протокола может быть полезно для вас.

Буферы протокола - это независимый от языка, платформенно-независимый, расширяемый механизм Google для сериализации структурированных данных - думаю, XML, но меньше, быстрее и проще . Вы определяете, как вы хотите, чтобы ваши данные были структурированы один раз, затем вы можете использовать специальный сгенерированный исходный код, чтобы легко записывать и считывать ваши структурированные данные в различные потоки данных и из них, используя различные языки - Java, C ++ или Python.

.NET порты доступны из Марк Гравелл и Джон Скит .

2 голосов
/ 20 декабря 2011

Я проверил все упомянутые проекты, такие как протокольные буферы, json, xml и т. Д., Но после того, как нашел BSON , я использую это по следующим причинам:

  • Простой в использовании API
  • Доступно на многих языках (C, C ++, Haskell, Go, Erlang, Perl, PHP, Python, Ruby, C #, ...)
  • Двоичный, следовательно, очень компактный и быстрый (меньше байт-> меньше времени)
  • постоянство на платформах (нет проблем с порядком байтов и т. Д.)
  • иерархическая. Модель данных сравнима с json (как следует из названия), поэтому большинство задач моделирования данных должны быть решаемыми.
  • Прекомпилятор не требуется
  • Широко используется (Mongodb, много языков)
1 голос
/ 09 апреля 2009

WCF - это решение .NET Framework для сериализации данных. Похоже, что эта ссылка выяснила, как использовать данные в c ++, это своего рода обратное направление к тому, что вы хотите, но может быть простой аналог для обращения.

http://geekswithblogs.net/cicorias/archive/2007/08/28/Consuming-WCF-Services-from-COM-using-C.aspx

0 голосов
/ 07 апреля 2009

Как уже упоминалось , буферные протоколы являются хорошим вариантом.

Если эта опция не удовлетворяет вашим потребностям, то я бы посмотрел на отправку XML клиенту (вам нужно было бы префикс сообщения с длиной, чтобы вы знали, сколько читать), а затем с использованием реализации IXmlSerializer или используйте атрибуты DataContract / DataMember вместе с DataContractSerializer, чтобы получить представление в .NET.

Я бы рекомендовал не использовать атрибуты маршалинга, поскольку они не поддерживаются такими вещами, как List<T> и рядом других стандартных классов .NET, которые вы обычно используете.

0 голосов
/ 07 апреля 2009

Есть много вариантов, которые вы можете выбрать. Именованные каналы, общие память, DDE, удаленное взаимодействие ... Зависит от вашей конкретной потребности.

Быстрый поиск в Google дал следующее:

Именованные трубы

Именованная общая память

DDE

0 голосов
/ 07 апреля 2009

Другие параметры будут:

  • создание двоичного файла, который содержит данные так, как вам нужно (непростое и портативное решение)

  • XML

  • YAML

  • текстовые файлы

0 голосов
/ 07 апреля 2009

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

Существует несколько библиотек для стандартных форматов, таких как ASN.1, HDF5 и т. Д., Которые не зависят от языка реализации. Существуют собственные библиотеки, которые служат той же цели (например, буферы протокола).

Если вы нацелены на конкретную архитектуру и компилятор, то вы также можете просто вывести объект C ++ в виде необработанных байтов и создать парсер на стороне C #.

То, что лучше, зависит от того, насколько плотно связаны вы хотите, чтобы ваши конечные точки были, и от того, являются ли данные в основном числовыми (HDF5), древовидными и последовательными структурами (ASN.1), или простыми объектами простых данных (непосредственная запись значений память)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...