У меня есть приложение.NET, которое сериализирует объект в двоичном формате. этот объект является структурой, состоящей из нескольких полей.
Я должен десериализовать и использовать этот объект в приложении C++. Я понятия не имею, существуют ли какие-либо библиотеки сериализации для C++, поиск Google не поднялся очень.
Что самый быстрый путь состоит в том, чтобы выполнить это?
Заранее спасибо. Roey.
Обновление: Я сериализировал Protobuf-сеть использования, в моем приложении.NET, с относительной простотой. Я также получаю .proto файл, который protobuf-сеть генерировала, с помощью команды GetProto(). В .proto файле мои поля GUID получают тип "bcl.guid", но C++, который не знает компилятор protoc.exe, как интерпретировать их! Что я делаю с этим?
Если вы используете BinaryFormatter
, то это будет практически невозможно. Не идите туда...
Protocol buffers разработан, чтобы быть переносимым, кроссплатформенным и устойчивым к версиям (так что он не взорвется, когда вы добавите новые поля и т.д.). Google предоставляет версию на C++, и есть несколько свободно распространяемых версий на C# (включая мою собственную) - полный список смотрите здесь.
Маленький, быстрый, простой.
Обратите внимание, что версия 1 protobuf-net не будет работать со структурами напрямую (вам понадобится класс DTO), но версия 2 (очень скоро) делает протестированную поддержку структур.
Сериализация в двоичном формате и ожидание того, что приложение на другом языке будет читать двоичный файл, - очень хрупкое решение (т. Е. Оно будет иметь тенденцию ломаться при малейшем изменении чего-либо).
Было бы более стабильно сериализовать данные в общем стандартном формате.
Согласен с другими. Делая это, вы делаете свое приложение очень уязвимым. Рассмотрим ситуацию, если один из классов, которые вы сериализуете, каким-либо образом изменен или построен на более поздней версии компилятора C #: ваши сериализованные классы потенциально могут измениться, что приведет к их нечитаемости.
Решение на основе XML может работать хорошо. Вы рассматривали SOAP? Немного не в моде, но стоит посмотреть. Основная проблема - отделить реализацию от данных. Вы можете сделать это в двоичном формате, если скорость / эффективность является проблемой, хотя, по моему опыту, это редко.
Есть ли у вас возможность изменить формат? Если это так, подумайте о выборе недвоичного формата для большей совместимости. Существует множество библиотек для чтения и записи XML. Json также популярен.
Двоичные форматы эффективны, но уязвимы для деталей реализации (упаковывает ли ваш компилятор C ++ структуры данных? Как представлены целые числа и числа с плавающей запятой? Какой порядок байтов используется?), И их трудно настроить, если они искажены. Текстовые форматы многословны, но, как правило, более надежны. Если вы не уверены в двоичных представлениях, текстовые представления, как правило, легче понять (помимо таких проблем, как кодовые страницы и широкие / узкие символы ...).
Для XML-библиотек C ++ наиболее функциональной (и, возможно, самой сложной) по-прежнему является библиотека Xerces . Но вы должны решить для себя , какая библиотека лучше всего соответствует вашим потребностям и навыкам .
Можете ли вы редактировать приложение .NET? Если да, то почему бы не использовать XML Serialization для вывода данных в удобном для импорта формате?
Лучше всего использовать сериализацию XML, на самом деле это самый чистый путь.
XmlSerializer s = new XmlSerializer( typeof( YourClassType ) );
TextWriter w = new StreamWriter( @"c:\list.xml" );
s.Serialize( w, yourClassListCollection );
w.Close();
И у boost, и у Google есть библиотеки для сериализации. Однако, если ваша структура довольно тривиальна, вы можете подумать об управлении сериализацией самостоятельно, записав байты из C #, а затем прочитав данные в C ++ с помощью fread.