Сериализовать в .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();