crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Сериализация списка указателей в boost
madnessw
  опции профиля:
сообщение 12.3.2010, 6:48
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 21
Регистрация: 12.3.2010
Пользователь №: 1527

Спасибо сказали: 0 раз(а)




Репутация:   0  


Доброговремени суток всем!
Возникла такая проблема:
есть несколько класов


      
// include headers that implement a archive in simple text format
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
// включаем, чтобы сериализация работала с векторами
#include <boost/serialization/vector.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <boost/serialization/shared_ptr_132.hpp>
#include <boost/serialization/list.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/strong_typedef.hpp>
//#include <boost/serialization/map.hpp>
//#include <boost/serialization/variant.hpp>

// включаем, чтобы нормально проходила сериализация XML
#include <boost/serialization/nvp.hpp>

#include <map>
#include "boost/variant.hpp"
#include <boost/fusion/container/list.hpp>
#include "boost/shared_ptr.hpp"
#include <string>
#include <iostream>
#include <fstream>

using namespace std;
using namespace boost;
                       typedef boost::variant<unsigned int,double,wstring> SCADAVariant;

        class Item;
        class Set;
        class Configuration;
        typedef list <boost::shared_ptr<Item>> pItemList;
        class Item
        {
            wstring fIdent;  //Идентификатор строковый
        public:
            Item();
            Item(wstring Ident);

            friend class boost::serialization::access;
            template<class Archive>
            void serialize(Archive & ar,const unsigned int vertion)
            {
                ar & BOOST_SERIALIZATION_NVP(fIdent);
            }

        };
                        class Set : public Item
        {
            friend Item;
            pItemList Items;  //Элементы множества
        public:
            
            friend class boost::serialization::access;            
            template<class Archive>
            void serialize(Archive & ar,const unsigned int vertion)
            {
                  ar & BOOST_SERIALIZATION_NVP(Items); //не сериалезует!
            }
            
        };


        //Главный класс конфигурации. Обеспечивает хранение и сериализацию
        
        template<typename TIArch, typename TOArch, typename TClass>
        void TestArch(const std::string & file, int flags, const TClass & cont)
        {

            { // Сериализуем
                std::ofstream ofs(file.c_str(), std::ios::out|flags);
                TOArch oa(ofs);
                // make_nvp создаёт пару имя-значение, которая отразится в XML
                // если не используем XML архив, то можно пару не создавать
                oa << boost::serialization::make_nvp("Test_Object", cont);
            }

            TClass newg;
            { // Десериализуем
                std::ifstream ifs(file.c_str(), std::ios::in|flags);
                TIArch ia(ifs);
                ia >> boost::serialization::make_nvp("Test_Object",newg);
            }

            { // Еще раз сериализуем, чтобы потом сравнить результаты двух сериализаций
                // и убедиться, что десериализациия прошла корректно
                std::ofstream ofs((file+".tmp").c_str(), std::ios::out|flags);
                TOArch oa(ofs);
                oa << boost::serialization::make_nvp("Test_Object", cont);
            }
        }

        class Configuration
        {
            friend Item;
            Set root;
        public:
            Configuration();  //Инициализация
            ~Configuration();
                                    friend class boost::serialization::access;
                                    template<class Archive>
            void serialize(Archive & ar,const unsigned int vertion)
            {
                ar & BOOST_SERIALIZATION_NVP(root);
            }

        };

проблема вследующем нополучается сериализовать стуктуру типа pItemList Items, она объявлена как typedef list <boost::shared_ptr<Item>>pItemList.
Посуте я пытаюсь сериализовать список умных указателей на что получаю:

Error 7 error LNK2019: unresolved external symbol "protected: void __thiscall boost::archive::basic_binary_iprimitive<class boost::archive::binary_iarchive,char,struct std::char_traits<char> >::load(class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > &)" (?load@?$basic_binary_iprimitive@Vbinary_iarchive@archive@boost@@DU?$char_traits@D@std@@@archive@boost@@IAEXAAV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@@Z) referenced in function "public: static void __cdecl boost::archive::load_access::load_primitive<class boost::archive::binary_iarchive,class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > >(class boost::archive::binary_iarchive &,class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > &)" (??$load_primitive@Vbinary_iarchive@archive@boost@@V?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@@load_access@archive@boost@@SAXAAVbinary_iarchive@12@AA
V?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@@Z)
вот и не пойму где ошибка может кто сталкивался с подобным?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
madnessw
  опции профиля:
сообщение 18.3.2010, 5:24
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 21
Регистрация: 12.3.2010
Пользователь №: 1527

Спасибо сказали: 0 раз(а)




Репутация:   0  


Как всегда всё оказалось проще чем я дкмал)))
Почитав кучу доки я в boost нашол макрос BOOST_SERIALIZATION_BASE_OBJECT_NVP
мне нужно было заюзать макрос ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Items) и вуаля всё заработало)))

Насчёт стрельбы по воробьям из пушки: у буста она сильно точно стреляет и велосипеды у них хорошие , много функциональные))))

на этом тему можно считать закрытой))))
Iron Bug - спасибо за участие
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 2.12.2024, 9:34