Сериализовать в С++, а затем десериализовать в С#?

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

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

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

Изменить

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

Ответ 1

Буферы протокола могут быть вам полезны.

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

Порты .NET доступны из Marc Gravell и Jon Skeet.

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

Ответ 5

Другие варианты:

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

  • XML

  • YAML

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

Ответ 6

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

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

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

Ответ 7

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

Быстрый googling дал следующее:

Именованные каналы

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

DDE