Форум программистов, компьютерный форум, киберфорум
Наши страницы

Boost C++

Войти
Регистрация
Восстановить пароль
 
sl_k
12 / 12 / 0
Регистрация: 15.04.2010
Сообщений: 61
#1

boost serialization. загрузка данных из архива в std::list - Boost C++

26.03.2013, 12:25. Просмотров 882. Ответов 2
Метки нет (Все метки)

День добрый, возникла небольшая проблема.
Я сохраняю данные в архив
используя
C++
1
2
3
4
5
6
7
8
9
10
#include<boost/serialization/list.hpp>
boost::archive::text_iarchive oarch(ofs);
 
//регистрируем тип
oarch.register_type<Derived>();
std::list<Derived*> list1;
...//заполняем лист
 
//записываем в архив
oarch << list1;
визуально проверяю файл - все хорошо, все данные на месте.

Затем пытаюсь эти данные прочитать:
C++
1
2
3
boost::archive::text_iarchive iarch(ifs);
std::list<Derived*> temp;
iarch >> temp;
на что компилятор мне выдает
Bash
1
segmentation fault
.

Подозрение на то что, может, у Derived не все в порядке с load_construct_data, не оправдываются, это я проверил
записав последний элемент из списка

C++
1
2
3
4
5
6
boost::archive::text_iarchive oarch(ofs);
std::list<Derived*> list1;
...//заполняем лист
 
//записываем последний элемент из листа
oarch << list1.back();
и затем считав его:

C++
1
2
3
boost::archive::text_iarchive iarch(ifs);
Derived* var;
iarch >> var;
var и temp.back() совпадают. Так что вариант неправильной реализации load_construct_data отпадает.

Есть ли у кого-нибудь идеи, почему boost не хочет грузить в std::list?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2013, 12:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос boost serialization. загрузка данных из архива в std::list (Boost C++):

Boost::serialization, как сериализовать std::tuple? - Boost C++
В принципе вопрос в теме. Как именно?

boost::serialization. Как сериальзовывать собственные типы данных? - Boost C++
Как с помощью буста сериализовать следующий класс? class data{ private: std::string Name; std::string Type; unsigned...

boost::serialization - Boost C++
Хотел бы узнать, есть ли преимущество в записи файла с boost::serialization перед обычной записью?

boost::serialization - Boost C++
Нечто вроде ДБ написано с использованием boost::any (любой конечный элемент ДБ, то есть содержимое любой ячейки - объект Holder в котором...

boost::serialization - Boost C++
Рассматривал тему boost::serialization. И в примере ниже моя студия выкидывает много ошибок. Можете пожалуйста подсказать в чем бида ...

serialized via boost::serialization - Boost C++
Как можно считать информацию с файла в вектор, при этом не зная заранее его размерность. В фукнции save() я записываю в файл n человек, а...

2
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
26.03.2013, 19:56 #2
Где-то у вас косяк. У меня все окей (поменяв Base* на Derived* тоже все ок).

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/list.hpp>
 
#include <list>
#include <sstream>
#include <iostream>
 
class Base
{
   friend class boost::serialization::access;
   template<typename Archive>
   void serialize(Archive&, const unsigned int)
   {
      
   }
public:
   virtual ~Base() = 0;
   virtual int get() const = 0;
};
 
Base::~Base() {}
 
class Derived : public Base
{
   friend class boost::serialization::access;
   template<typename Archive>
   void serialize(Archive& ar, const unsigned int)
   {
      ar & boost::serialization::base_object<Base>(*this);
   }
public:
   Derived(int val) : value(val)
   {
   }
   int get() const { return value; }
private:
   int value;
};
 
namespace boost { namespace serialization {
 
template<typename Archive>
void save_construct_data(Archive& ar, const Derived* d, const unsigned int)
{
   int value = d->get();
   ar << value;
}
 
template<typename Archive>
void load_construct_data(Archive& ar, Derived* d, const unsigned int)
{
   int value = 0;
   ar >> value;
   ::new(d) Derived(value);
}
 
}
 
}
 
int main()
{
   std::list<Base*> ders = 
   {
      new Derived(5),
      new Derived(10)
   };
   std::stringstream ss;
   boost::archive::text_oarchive oarch(ss);
   oarch.register_type<Derived>();
   oarch << ders;
   std::cout << ss.str() << std::endl;
   boost::archive::text_iarchive iarch(ss);
   iarch.register_type<Derived>();
   std::list<Base*> outs;
   iarch >> outs;
   for (const auto& p : outs)
   {
      std::cout << p->get() << std::endl;
   }
}
http://liveworkspace.org/code/2yT2gx$13
0
sl_k
12 / 12 / 0
Регистрация: 15.04.2010
Сообщений: 61
26.03.2013, 20:46  [ТС] #3
ForEveR, решил проблему поэлементной выгрузкой и загрузкой в цикле. Странно то, что есть лист который состоит из указателей на просто класс (без родителей и наследников)
C++
1
std::list<someClase*>
. Он загружается без проблем
со своей родной приватной функцией
C++
1
serialize
, но у него есть конструктор по умолчанию , я так подозреваю, что буст не очень любит сочетать загрузку STL объектов через load_construct_data еще и класса наследника.
Впереди load_construct_data для
C++
1
SomeClass
- меняю конструктор, так что посмотрим, как он будет себя вести. Надеюсь, хоть этот класс загрузится "как по инструкции". Если не будет, то опять придется через цикл.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.03.2013, 20:46
Привет! Вот еще темы с ответами:

Как подключить Boost::serialization в CMakeLists.txt? - Boost C++
Если кто-то работал с таким и готов помочь, то спасибо)

boost serialization. Перегрузка save_construct_data и load_constract_data для шаблонных классов - Boost C++
Добрый вечер, снова сериализация и снова проблема. Нужно сериализовать шаблонный класс без конструктора по умолчанию. Ниже приведен...

Boost::any and std::function - Boost C++
#include &lt;iostream&gt; #include &lt;typeinfo&gt; #include &lt;functional&gt; #include &lt;boost/any.hpp&gt; struct Foo { void bar() { ...

Подключение boost как std - Boost C++
Возможно ли подключить boost как std? Ну например, чтоб это: #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;boost/regex.hpp&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru