2010-07-19 2 views
2

Пример сериализации ниже от boost mailing list, который в значительной степени совпадает с тем, что я хотел бы сделать. Однако я изменил архив так, чтобы он сериализовался в XML. Компиляция не прерывается, если я сериализуюсь в двоичном формате, но это не удается при сериализации в xml. Компиляции завершается в basic_xml_oarchive.hpp следующим способом:Сериализация карты объектов в xml с помощью boost :: serialization

// boost code where compile fails 
template<class T> 
void save_override(T & t, BOOST_PFTO int) 
{ 
    // If your program fails to compile here, its most likely due to 
    // not specifying an nvp wrapper around the variable to 
    // be serialized. 
    BOOST_MPL_ASSERT((serialization::is_wrapper<T>)); 
    this->detail_common_oarchive::save_override(t, 0); 
} 

Кажется, я не сделал достаточно, чтобы позволить std::map<int, CSomeData> объект для сериализации, любые идеи о том, как это исправить?


Моя реализация сериализации:

#include <boost/archive/xml_oarchive.hpp> 
#include <boost/archive/xml_iarchive.hpp> 
#include <boost/serialization/map.hpp> 
#include <fstream> 
#include <string> 
#include <map> 

using namespace std; 

// This is a test class to use as the map data. 
class CSomeData { 
    public: 
     CSomeData(){}; 
     CSomeData(float f0, string str0) 
     { 
      m_f0 = f0; 
      m_str0 = str0; 
     } 

     float m_f0; 
     string m_str0; 

    private: 
     friend class boost::serialization::access; 

     template<class Archive> 
     void serialize(Archive &ar, const unsigned int version) 
     { 
      ar & m_f0; 
      ar & m_str0; 
     } 
}; 

// This is the class we really want to try serializing. 
class CTest { 
    public: 
     CTest(){}; 
     CTest(int nNumber) 
     { 
      m_nNumber = nNumber; 

      // Fill with some dummy data. 
      m_mTst.insert(make_pair(0, CSomeData(0.23f, "hi hi hi"))); 
      m_mTst.insert(make_pair(1, CSomeData(7.65f, "second one"))); 
      m_mTst.insert(make_pair(2, CSomeData(9.23f, "third one"))); 
      m_mTst.insert(make_pair(3, CSomeData(5.6766, "chosen one"))); 
     } 
     ~CTest(){}; 

     save() 
     { 
      std::ofstream ofs("filename"); 

      // Write class instance to archive. Writing seems to work ok. 
      boost::archive::xml_oarchive oa(ofs); 
      oa << BOOST_SERIALIZATION_NVP(*this); 
     } 

     int m_nNumber; 

    private: 
     map<int, CSomeData> m_mTst; 

     friend class boost::serialization::access; 

     template<class Archive> 
     void serialize(Archive &ar, const unsigned int version) 
     { 
      ar & m_nNumber; 
      ar & m_mTst; 
     } 
}; 
+0

Я думаю, что моя проблема в том, что сериализация не поддерживается в CodeGear. http://blogs.embarcadero.com/ddean/2009/09/23/34847 – Seth

ответ

4

Я считаю, что вам нужно, чтобы пометить элементы с именем для XML сериализации. Это указывает имя элемента, которое будет использоваться в XML. То есть использовать что-то вроде:

ar & BOOST_SERIALIZATION_NVP(m_f0); 

или (лучше в данном случае):

ar & make_nvp("field0", my_f0); 

теги будут игнорироваться для бинарной сериализации. Подробнее здесь:

http://www.boost.org/doc/libs/1_43_0/libs/serialization/doc/wrappers.html

+0

Это не сработало, и я уже использовал макрос 'BOOST_SERIALIZATION_NVP' – Seth

+0

CSomeData :: serialize() не указан в приведенном выше коде , –

+0

Вы правы! Это тоже скомпилировано. – Seth

Смежные вопросы