сериализируйте в.NET, десериализуйте в C++

У меня есть приложение.NET, которое сериализирует объект в двоичном формате. этот объект является структурой, состоящей из нескольких полей.

Я должен десериализовать и использовать этот объект в приложении C++. Я понятия не имею, существуют ли какие-либо библиотеки сериализации для C++, поиск Google не поднялся очень.

Что самый быстрый путь состоит в том, чтобы выполнить это?

Заранее спасибо. Roey.

Обновление: Я сериализировал Protobuf-сеть использования, в моем приложении.NET, с относительной простотой. Я также получаю .proto файл, который protobuf-сеть генерировала, с помощью команды GetProto(). В .proto файле мои поля GUID получают тип "bcl.guid", но C++, который не знает компилятор protoc.exe, как интерпретировать их! Что я делаю с этим?

11
задан Roey 3 March 2010 в 09:36
поделиться

7 ответов

Если вы используете BinaryFormatter, то это будет практически невозможно. Не идите туда...

Protocol buffers разработан, чтобы быть переносимым, кроссплатформенным и устойчивым к версиям (так что он не взорвется, когда вы добавите новые поля и т.д.). Google предоставляет версию на C++, и есть несколько свободно распространяемых версий на C# (включая мою собственную) - полный список смотрите здесь.

Маленький, быстрый, простой.

Обратите внимание, что версия 1 protobuf-net не будет работать со структурами напрямую (вам понадобится класс DTO), но версия 2 (очень скоро) делает протестированную поддержку структур.

7
ответ дан 3 December 2019 в 07:37
поделиться

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

Было бы более стабильно сериализовать данные в общем стандартном формате.

0
ответ дан 3 December 2019 в 07:37
поделиться

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

Решение на основе XML может работать хорошо. Вы рассматривали SOAP? Немного не в моде, но стоит посмотреть. Основная проблема - отделить реализацию от данных. Вы можете сделать это в двоичном формате, если скорость / эффективность является проблемой, хотя, по моему опыту, это редко.

1
ответ дан 3 December 2019 в 07:37
поделиться

Есть ли у вас возможность изменить формат? Если это так, подумайте о выборе недвоичного формата для большей совместимости. Существует множество библиотек для чтения и записи XML. Json также популярен.

Двоичные форматы эффективны, но уязвимы для деталей реализации (упаковывает ли ваш компилятор C ++ структуры данных? Как представлены целые числа и числа с плавающей запятой? Какой порядок байтов используется?), И их трудно настроить, если они искажены. Текстовые форматы многословны, но, как правило, более надежны. Если вы не уверены в двоичных представлениях, текстовые представления, как правило, легче понять (помимо таких проблем, как кодовые страницы и широкие / узкие символы ...).

Для XML-библиотек C ++ наиболее функциональной (и, возможно, самой сложной) по-прежнему является библиотека Xerces . Но вы должны решить для себя , какая библиотека лучше всего соответствует вашим потребностям и навыкам .

0
ответ дан 3 December 2019 в 07:37
поделиться

Можете ли вы редактировать приложение .NET? Если да, то почему бы не использовать XML Serialization для вывода данных в удобном для импорта формате?

7
ответ дан 3 December 2019 в 07:37
поделиться

Лучше всего использовать сериализацию XML, на самом деле это самый чистый путь.

XmlSerializer s = new XmlSerializer( typeof( YourClassType ) );
TextWriter w = new StreamWriter( @"c:\list.xml" );
s.Serialize( w, yourClassListCollection );
w.Close();
0
ответ дан 3 December 2019 в 07:37
поделиться

И у boost, и у Google есть библиотеки для сериализации. Однако, если ваша структура довольно тривиальна, вы можете подумать об управлении сериализацией самостоятельно, записав байты из C #, а затем прочитав данные в C ++ с помощью fread.

1
ответ дан 3 December 2019 в 07:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: