C ++ Сериализация Чистый XML похож на XSTREAM - PullRequest
5 голосов
/ 21 мая 2010

Мне нужно написать приложение linux c ++, которое сохраняет настройки в формате XML (для удобного ручного редактирования), а также взаимодействует с существующими приложениями через сообщения XML через сокеты и HTTP. Проблема в том, что мне не удалось найти каких-либо интеллектуальных библиотек, которые бы мне помогли, мне особенно не хочется писать DOM или SAX-код только для того, чтобы писать и читать очень простые сообщения.

Повышенная сериализация была почти совпадением, но она добавляет много специфичных для повышения данных в xml, который она генерирует. Это явно не работает для форматов обмена. Мне интересно, можно ли заставить Boost Serialization или какую-либо другую библиотеку сериализации c ++ генерировать чистый xml. Я не против, если есть какие-то обязательные дополнительные атрибуты - например, атрибут версии, но мне бы очень хотелось иметь возможность контролировать их именование, а также избавиться от «функций», которые я не использую - tracking_level и class_id для пример.

В идеале я бы хотел иметь что-то похожее на xstream в Java. Я осознаю тот факт, что в С ++ отсутствует интроспекция, и поэтому необходимо выполнить какое-то ручное кодирование, но было бы неплохо, если бы существовало чистое решение, позволяющее просто читать и писать простой XML без ключей!

Если это невозможно, меня также интересуют инструменты, в которых XML-схема является каноническим ресурсом (сначала контракт) - хорошая альтернатива JAXB для C ++. До сих пор я нашел только коммерческие решения, такие как CodeSynthesis XSD. Я бы предпочел решения с открытым исходным кодом. Я пробовал gSoap - но он генерирует действительно некрасивый код, а также специфичен для SOAP.

В отчаянии я также начал искать альтернативные форматы сериализации для протобуферов. Это существует - но только для Java! Меня действительно удивляет, что протоколные буферы, похоже, являются лучшим поддерживаемым форматом обмена данными, чем XML.

Я схожу с ума, просто нахожу библиотек для этого приложения, и мне действительно нужны новые идеи. Кто-нибудь?

Ответы [ 3 ]

0 голосов
/ 21 мая 2010

Чтобы еще больше расширить ответ Трубадура, я с большим успехом использовал библиотеки Qt XML , делая что-то очень похожее на то, что вы есть. В моем собственном случае я сериализирую данные конфигурации в локальный файл, а затем периодически передаю их в другие потоки.

QXmlStreamWriter и QXmlStreamReader - это два рассматриваемых класса. Здесь - пример их использования.

Что касается моей собственной сериализации XML, я полностью контролирую фактический формат, и для его выполнения потребовалось всего несколько сотен строк кода. Самое приятное, что я могу сказать об использовании XML в Qt, - это то, что я мог бы сосредоточиться на контенте и позволить библиотекам выполнять болезненную работу по разметке данных - что идеально.

Наконец, здесь - это некоторая информация о лицензиях Qt (Commercial, GPL, LGPL).

0 голосов
/ 29 июня 2012

Цитата из вопроса: "Пока я нашел только коммерческие решения, такие как CodeSynthesis XSD. Я бы предпочел решения с открытым исходным кодом "

CodeSynthesis XSD может использоваться в проектах с открытым исходным кодом. Продукт имеет коммерческую частную лицензию , но в дополнение к этому также Лицензия с открытым исходным кодом (GPL версия 2, но с дополнительная свобода предоставляется). Вы можете использовать его вместе со всеми «GPL-совместимые лицензии свободных программ» и все «GPL-несовместимые бесплатные» Лицензии на программное обеспечение », перечисленные в http://www.gnu.org/licenses/license-list.html

Третий вариант лицензии для CodeSynthesis XSD - Free Proprietary Лицензия на малые словари . Вы можете использовать эту лицензию бесплатно если вы используете небольшую XML-схему.

Подробнее о различных лицензиях CodeSynthesis XSD здесь: http://www.codesynthesis.com/products/xsd/license.xhtml

С точки зрения функциональности CodeSynthesis XSD также поддерживает сериализацию и синтаксический анализ сгенерированного двоичного формата. Вы могли бы использовать этот формат для эффективного общения.

0 голосов
/ 21 мая 2010

Я не уверен, что именно он предоставляет, и поэтому, если это то, что вы ищете, но у Qt есть модуль xml. Он также имеет сетевой модуль, который звучит так, как будто он может быть вам полезен.

...