2010-02-08 4 views
8

Ich fange an, Boost :: Serialisierung in XML-Archiven zu verwenden. Ich kann Daten erzeugen und lesen, aber wenn ich das XML manuell modifiziere und zwei Tags vertausche, "scheitert es" (d. H. Es läuft glücklich ab).Warum überprüft boost :: serialization nicht nach Tag-Namen in XML-Archiven?

Hier ist eine kleine, in sich komplettes Beispiel zeigt, was ich sehe:

#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); 
} 

Diese XML auf die Standardausgabe schreibt, die enthält:

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

Nun ersetze ich den gesamten Code in der Hauptfunktion mit einem Lesegerät:

funktioniert wie erwartet, wenn der vorherige Ausgang (Ausgänge "X XX 0.0.1 "). Wenn ich jedoch XML füttere, in dem ich die Reihenfolge der beiden Zeilen "Producer" und "Producer_Version" geändert habe, läuft es immer noch und gibt "0.0.1 XXX" aus.

Daher erkennt es nicht, dass die Tags nicht die erwarteten Namen haben, und fahren Sie einfach fort. Ich hätte erwartet, dass es eine xml_archive_parsing_error Ausnahme ausgelöst hat, wie in the doc angegeben.

Hat jemand hier Erfahrung damit? Was mache ich falsch?

Antwort

6

Wenn Sie nur die Reihenfolge der beiden Zeilen ändern, wird keine xml_archive_parsing_error Ausnahme ausgelöst. Die doc Sie verknüpft haben, sagt, dass selbst:

(...) Dieser möglich sein könnte, wenn nur die Daten geändert werden und nicht das XML-Attribut und Verschachtelung Struktur unverändert bleiben (...)

.

Sie haben keine Attribute geändert und die Reihenfolgeänderung hat die Struktur beibehalten (immer noch zwei Felder auf der ersten Ebene Ihres XML). Keine Ausnahme wird jemals auf diese Weise geworfen werden.

Wenn der XML-Parameter make_nvp function gelesen wird, wird auch der Name-Parameter keine Einschränkung für das, was gelesen wird. Es wird nur willkürlich den Namen angeben, der mit dem neuen Name-Wert-Paar verwendet werden soll.

So können Sie den Namen Ihres XML-Tags auf Ihrer Eingabe ändern, solange Sie nicht Ihre erwartete Reihenfolge ändern, dh Sie producer und producer_version auf XML zu foo und bar umbenennen könnte und würde lesen noch die serialisierten Daten richtig heißt:

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

Und Ihre gedruckte Antwort noch „XXX wäre 0.0.1 ".

Da dies Ihre serialisierten Daten nur als XML formatiert, besteht kein Interesse daran, die Tag-Namen zu überprüfen. Sie werden nur verwendet, um Ihre serialisierte Ausgabe lesbarer zu machen.

+6

Irgendwie traurig, aber wenn es so ist. Danke für die Info (Ich fand diesen Dokumentabsatz besonders schwer zu lesen, aufgrund der übermäßigen Verwendung von Negation und Conditionals). –

+0

...Darüber hinaus würde im Geiste der Bibliothek die Überprüfung der XML-Tag-Konsistenz als inakzeptable Leistungseinbuße betrachtet werden. Mit anderen Worten, XML-Tag in Boost-Serialisierung sind nur für Menschen, nicht für die Software. Es ist in der Tat zu Beginn kontra intuitiv und verwirrend, ich hätte eine Option bevorzugt, XML-Prüfung zu erlauben. – alfC