Почему бы не повысить :: сериализацию проверки имен тегов в архивах XML? - PullRequest
8 голосов
/ 08 февраля 2010

Я начинаю использовать boost :: serialization в XML-архивах. Я могу производить и читать данные, но когда я вручную изменяю XML и обмениваюсь двумя тегами, он «не дает сбоя» (т. Е. Проходит успешно).

Вот небольшой, полностью завершенный пример, показывающий, что я вижу:

#include <iostream>
#include <fstream>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/serialization/split_member.hpp>
using namespace std;

int main (void)
{
  boost::archive::xml_oarchive oa (cout);
  static const string producer = "XXX", version  = "0.0.1";
  oa << boost::serialization::make_nvp ("producer", producer);
  oa << boost::serialization::make_nvp ("producer_version", version);
}

Это записывает XML в стандартный вывод, который содержит:

<producer>XXX</producer>
<producer_version>0.0.1</producer_version>

Теперь я заменяю весь код в основной функции читателем:

  boost::archive::xml_iarchive ia (cin);
  string producer, version;
  ia >> boost::serialization::make_nvp ("producer", producer);
  ia >> boost::serialization::make_nvp ("producer_version", version);
  cout << producer << "  " << version << endl;

, который работает, как ожидается, при подаче предыдущего выхода (выводит «XXX 0.0.1»). Однако, если я передаю ему XML, в котором я изменил порядок двух строк «продюсер» и «производитель_версия», он все еще работает и выдает «0.0.1 XXX».

Таким образом, он не может распознать, что у тегов нет ожидаемых имен, и просто продолжить. Я ожидал бы, что это вызовет исключение xml_archive_parsing_error, как указано в документ .

Кто-то здесь имеет опыт с этим? Что я делаю не так?

1 Ответ

6 голосов
/ 08 февраля 2010

Простое изменение порядка двух строк не приведет к исключению xml_archive_parsing_error. документ , который вы связали, говорит сам за себя:

(...) Это может быть возможно, если изменяются только данные, а атрибуты XML и структура вложений не изменяются. (...)

Вы не изменили атрибуты, и изменение порядка сохранило структуру (по-прежнему два поля на первом уровне вашего XML). Никакие исключения никогда не будут выброшены таким образом.

Кроме того, при чтении XML с использованием make_nvp function параметр name не будет накладывать никаких ограничений на то, что читается. Он просто произвольно сообщит имя, которое будет использоваться с новой парой имя-значение.

Таким образом, вы можете изменить имя ваших тегов XML на входе, если вы не измените ожидаемый порядок, то есть вы можете переименовать producer и producer_version в своем XML на foo и bar и все равно будет правильно читать сериализованные данные, например:

<foo>XXX</foo>
<bar>0.0.1</bar>

И ваш печатный ответ все равно будет "XXX 0.0.1" .

Поскольку это только форматирование ваших сериализованных данных в формате XML, нет никакой заинтересованности в проверке имен тегов. Они используются только для того, чтобы сделать ваш сериализованный вывод более читабельным.

...