Сериализовать в .NET, десериализовать в С++

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

Я должен десериализовать и использовать этот объект в приложении на С++. Я понятия не имею, есть ли библиотеки сериализации для С++, поиск в google не сильно зашел.

Каков самый быстрый способ выполнить это?

Спасибо заранее. Roey.

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

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

XmlSerializer s = new XmlSerializer( typeof( YourClassType ) );
TextWriter w = new StreamWriter( @"c:\list.xml" );
s.Serialize( w, yourClassListCollection );
w.Close();