Сериализовать в С++, а затем десериализовать в С#?
Есть ли простой способ сериализации данных в С++ (либо в 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
Другие варианты:
Ответ 6
Как уже упоминалось, протокольные буферы - хороший вариант.
Если этот параметр не подходит вашим потребностям, я бы посмотрел на отправку XML клиенту (вам нужно было бы префикс сообщения с длиной, чтобы вы знали, сколько нужно прочитать), а затем используя реализацию IXmlSerializer или используйте атрибуты DataContract/DataMember в сочетании с DataContractSerializer, чтобы получить ваше представление в .NET.
Я бы рекомендовал не использовать атрибуты маршалинга, поскольку они не поддерживаются такими вещами, как List<T>
и ряд других стандартных классов .NET, которые вы обычно используете.
Ответ 7
Есть много вариантов, которые вы можете выбрать. Именованные каналы, общие
память, DDE, дистанционное управление... Зависит от вашей конкретной потребности.
Быстрый googling дал следующее:
Именованные каналы
Именованная общая память
DDE