Я начинаю использовать повышение:: сериализация на архивах 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
исключение, как обозначено в документе.
У кого-то здесь есть опыт с этим? Что я делаю неправильно?
Просто измените порядок две строки не вызовут исключения xml_archive_parsing_error
. doc , который вы связали, говорит, что сам по себе:
(...) Это могло бы быть возможным, если бы были изменены только данные, а не атрибуты XML и структура вложенности остались неизменными. (... )
Вы не изменили атрибуты, и изменение порядка сохранило структуру (все еще два поля на первом уровне вашего XML). Таким образом не возникнет никаких исключений.
Кроме того, при чтении XML с помощью функции make_nvp
параметр name не накладывает никаких ограничений на то, что читается. Он просто произвольно укажет имя, которое будет использоваться с новой парой имя-значение.
Таким образом, вы можете изменить имя ваших XML-тегов во входных данных, если вы не измените ожидаемый порядок, т.е. вы можете переименовать производителя
и продюсера_версия
в вашем XML в foo
и bar
и все равно будут правильно читать сериализованные данные, например:
XXX
0.0.1
И ваш напечатанный ответ все равно будет «XXX 0.0.1» .
Поскольку это только форматирование ваших сериализованных данных как XML, нет никакого интереса в проверке имен тегов. Они используются только для того, чтобы сделать ваш сериализованный вывод более читабельным.