Почему не повышает:: проверка сериализации на имена тега в архивах XML?

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

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

#include 
#include 
#include 
#include 
#include 
#include 
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 в стандартный вывод, который содержит:

XXX
0.0.1

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

  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, в котором я изменил порядок этих двух строк "производитель" и "producer_version", это все еще работает и выводы "0.0.1 XXX".

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

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

8
задан Benjamin 11 July 2014 в 11:21
поделиться

1 ответ

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

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

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

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

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

XXX
0.0.1

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

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

6
ответ дан 5 December 2019 в 22:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: