crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Сериализация списка указателей в 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
  опции профиля:
сообщение 12.3.2010, 8:28
Сообщение #2


Студент
*

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

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




Репутация:   0  


С этим вроде разобрался: оказалось я пытался сериализовать wstring fIdent а буст не поддерживает сериализацую wstring.
Теперь вопрос как Сериализовать wstrinig ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 12.3.2010, 18:10
Сообщение #3


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

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




Репутация:   12  


Буст поддерживает сериализацию wstring. Вроде бы он для этого должен быть скомпилен с ICU, хотя конкретно насчёт библиотеки сериализации точно не могу сказать, может, ей просто опцию какую-то надо указать при сборке. У меня буст собран с ICU и все юникодовские функции работают. Но не все комилеры поддерживают юникод. Например, mingw его не поддерживает.
Юзай wofstream и binary_woarchive, если компилятор позволяет. Если нет - то переводи в string и сериализуй как string, а потом обратно. Либо как бинарный поток.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
madnessw
  опции профиля:
сообщение 13.3.2010, 18:15
Сообщение #4


Студент
*

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

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




Репутация:   0  


с wstring я разобрался в опциях прроекта переходим: Configuration properties -> C++ -> Langages->Treast wchar_t as Built-in type = <inherit from parent or project defaults>
и усё работает )))))))

теперь осталось только одно понять как сериализовать конструкцию типа

List<shared_ptr<Item>> pItemList , где Item - класс, а проще как сериализовать список умных указателей на класс?

Iron Bug - спасибо за совет)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 14.3.2010, 17:34
Сообщение #5


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

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




Репутация:   12  


я не совсем понимаю, нафига сериализовать такие сложные аггломераты, но люди пишут, что даже такой изврат возможен.
учимся пользоваться гуглом и в поиске по строке "boost serialization shared_ptr" находим вот это:
http://www.boost.org/doc/libs/1_42_0/libs/...shared_ptr.html

дальше читать всё это и усваивать.
но я бы не стала связываться с такими наворотами. да и автор статьи не рекомендует этого делать, ибо даже после всей этой возни остаются некоторые нерешённые вопросы.
а вообще, зачем тебе столько наворотов для сохранения в файл? может, всё куда проще решается, нежели чем через такие пампасы?
конечно, если хочешь, ковыряй статью, пиши кучу кода. это не возбраняется. но что-то мне подсказывает, что есть куда более простое решение для задачи, которую ты пытаешься решить.

Сообщение отредактировал Iron Bug - 14.3.2010, 17:35
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
madnessw
  опции профиля:
сообщение 16.3.2010, 4:23
Сообщение #6


Студент
*

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

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




Репутация:   0  


эо пример класса конфигурации есть несколько деревьев Item может находиться сразу в нескольких деревьяк(у нас они называются измерения)
я думал сначало сохранять всё в поток но понял что пытаюсь написать велосипед тк в бусте сериализация позволяет сохранять в бинарник в текст и в поток)
вот и думаю как это сделать))) по сути мне нужно сохранить список всех итемов и указателей а при загрузке востановить всё это дело в пямяти)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 16.3.2010, 10:26
Сообщение #7


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

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




Репутация:   12  


имхо, в такой ситуации лучше бы сделать синглтон, который работает непосредственно с конфигурацией, а в нём реализовать список элементов и сквозные массивы указателей на них (boost::intrusive).
ведь конфигурация - это обычно не то, что постоянно меняется и меняется неожиданно из разных мест.
городить сериализацию тэмплейтов - дело неблагодарное. а главное - из пушки по воробьям :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
madnessw
  опции профиля:
сообщение 18.3.2010, 5:24
Сообщение #8


Студент
*

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

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




Репутация:   0  


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

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

на этом тему можно считать закрытой))))
Iron Bug - спасибо за участие
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
madnessw
  опции профиля:
сообщение 27.9.2010, 9:36
Сообщение #9


Студент
*

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

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




Репутация:   0  


Вышел интересный Баг в сериализации wstring : у меня boost отказывается сериализовать wstring который содержит русские буквы.....

Может кто сталкивался с добной проблеммой?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 1.10.2010, 9:58
Сообщение #10


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

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




Репутация:   12  


проверь локали на машине, если это линюкс. может банально не быть нужной локали. проверь опции юникода для компилера.
если не оно, то пиши пример, как конкретно ты сериализуешь и чем собираешь.

Сообщение отредактировал Iron Bug - 1.10.2010, 9:59
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 19.4.2024, 2:08