8

XMLアーカイブでboost::serializationを使い始めています。データを生成して読み取ることはできますが、XMLを手動で変更し、2つのタグを交換すると、「失敗しません」(つまり、正常に進行します)。

これが私が見ているものを示す小さな、自己完結した例です:

#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>

ここで、main関数のすべてのコードをリーダーに置き換えます。

  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;

これは、前の出力(出力「XXX0.0.1」)をフィードしたときに期待どおりに機能します。ただし、「producer」と「producer_version」の2行の順序を変更したXMLをフィードすると、引き続き実行され、「0.0.1XXX」が出力されます。

したがって、タグに期待される名前がないことを認識できず、続行します。ドキュメントxml_archive_parsing_errorに示されているように、例外がスローされると予想していました。

ここの誰かがそれを経験したことがありますか?私が間違っていることは何ですか?

4

1 に答える 1

6

xml_archive_parsing_error2行の順序を変更するだけでは、例外は発生しません。あなたがリンクしたドキュメントはそれ自体を言っています:

(...)これは、データのみが変更され、XML属性とネスト構造が変更されないままになっている場合に可能になる可能性があります。(...)

属性を変更しておらず、順序の変更により構造が維持されています(XMLの最初のレベルにある2つのフィールドのままです)。この方法で例外がスローされることはありません。

また、を使用してXMLを読み取る場合make_nvp function、nameパラメーターは読み取られる内容に制限を課しません。新しい名前と値のペアで使用される名前を任意に指示するだけです。

したがって、予想される順序を変更しない限り、入力のXMLタグの名前を変更できます。つまり、XMLの名前を変更producerproducer_versionてXMLを変更foobar、シリアル化されたデータを正しく読み取ることができます。

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

そして、あなたの印刷された答えはまだ「XXX0.0.1」です。

これはシリアル化されたデータをXMLとしてフォーマットするだけなので、タグ名をチェックする必要はありません。これらは、シリアル化された出力を読みやすくするためにのみ使用されます。

于 2010-02-08T19:28:52.860 に答える