С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774

Поясните по сериализации

12.02.2016, 14:10. Показов 3016. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В boost::serialization
Нужно слить мап в файл.

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

Добавлено через 5 минут
tovar
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
#include <iostream>
#include <string>
#include <fstream>
#include "boost/date_time/gregorian/gregorian.hpp"
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
using namespace std;
using namespace boost::gregorian;
 
class Tovar
{
public:
    Tovar(string s = "", string s1 = "") :type(s), date(s1) {}
    void Print()const { cout << type << " " << date; }
    ~Tovar();
private:
    friend class boost::serialization::access;
    template<typename Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & type;
        ar & date;      
    }
    string type;
    string date;
};
office:tovar
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include"Tovar.h"
#include <boost/serialization/base_object.hpp>
class Office:public Tovar
{
public:
    Office(string s1 = "", string s2 = "") :Tovar("office", s1), name(s2) {};
    ~Office();
private:
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {       
        ar & boost::serialization::base_object<Tovar>(*this);
        ar & name;      
    }
    string name;
};
main
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main()
{
    ofstream ofs("filename.bin");
    Office of("pencil", "pen");
    //of.Print();
    boost::archive::text_oarchive oa(ofs);
    oa << of;
    Office newg;
    {
        
        std::ifstream ifs("filename.bin");
        boost::archive::text_iarchive ia(ifs);
        
        ia >> newg;
        
    }
    newg.Print();
 
    system("pause");
    return 0;
}
Добавлено через 1 минуту
В написанном выше варианте крашит
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.02.2016, 14:10
Ответы с готовыми решениями:

Метод сериализации
Помогите найти пинфу по Методу сериализации

Вопросы сериализации
Ноги здесь: https://www.cyberforum.ru/cpp-beginners/thread433207.html Кстати, по этой теме. А если мне надо загнать довольно...

Ищу литературу по интерфейсам, делегатам, сериализации и т.п. применительно к C++
Добрый вечер. Подскажите, есть ли какая литература по интерфейсам, делегатам, сериализации и т.д., как и когда их применять на практике, но...

13
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
12.02.2016, 14:36
Цитата Сообщение от anti-k Посмотреть сообщение
Нужно слить мап в файл.
Сам класс map - библиотека умеет сериализовать (т.е. никаких циклов по элементам или еще чего писать не надо).
Классы, про которые она "не знает", и объекты которых нужно сериализовать - нужно описывать самому.
Если класс "чужой", то есть возможность задать функцию сериализации в качестве внешней.
Вот небольшой пример:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <string>
#include <map>
 
#include <boost/ref.hpp>
 
#include <boost/serialization/map.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/archive/xml_oarchive.hpp>
 
class Connection
{
public:
    Connection(std::string a_strProtocol, int a_nPort)
      : m_strProtocol(a_strProtocol), m_nPort(a_nPort)
    {}
    
    ~Connection()
    {}
    
    // Сериализация для Connection
    template <class archive>
    void serialize(archive& ar, const unsigned int version)
    {
        using boost::serialization::make_nvp;
        
        // Как сериализовать std::string - библиотека знает сама
        ar & make_nvp("Protocol", m_strProtocol); 
        ar & make_nvp("Port", m_nPort);
    }
 
private:
    std::string m_strProtocol;
    int m_nPort;
};
 
// Сериализация для std::reference_wrapper
template <class archive>
void serialize(archive& ar, std::reference_wrapper<Connection> ref, const unsigned int version)
{
    ref.get().serialize(ar, version);
}
 
class Connections
{
public:
    Connections()
        : m_conn1("TCP", 6004)
        , m_conn2("UDP", 5003)
        , m_connections{{ "Clients", std::ref(m_conn1)}, {"Devices", std::ref(m_conn2) } }
    {};
    
    // Сериализация для Connections
    template <class archive>
    void serialize(archive& ar, const unsigned int version)
    {
        using boost::serialization::make_nvp;
        
        // Как сериализовать std::map - библиотека знает сама
        ar & make_nvp("Connections", m_connections); 
    }
        
  public:  
    Connection m_conn1;
    Connection m_conn2;
    std::map<std::string, std::reference_wrapper<Connection>> m_connections;
};
 
int main(int argc, char* argv[])
{
    std::ostream & ofs = std::cout;
    
    Connections conn;
    
    boost::archive::xml_oarchive xml(ofs);
    xml << boost::serialization::make_nvp("Connections", conn);
}
http://rextester.com/HURJ52648


Добавлено через 9 минут
Цитата Сообщение от anti-k Посмотреть сообщение
В написанном выше варианте крашит
Не крашит, а бросает исключение, которое ты успешно не ловишь.
Сделай так.
C++
1
2
3
4
5
6
7
8
9
10
int main()
{
    ofstream ofs("filename.bin");
    Office of("pencil", "pen");
    //of.Print();
    boost::archive::text_oarchive oa(ofs);
    oa << of;
    ofs.flush(); // здесь
//......
}
У тебя данные еще не записались в файл, а ты их уже читать пытаешься:
1
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
12.02.2016, 14:45  [ТС]
DrOffset, вы онлайн
Пример немного сложный для меня, но думаю со временем вникну.
Остались вопросы:
1)
Цитата Сообщение от DrOffset Посмотреть сообщение
Классы, про которые она "не знает", и объекты которых нужно сериализовать - нужно описывать самому.
Я сериализую всю иерархию от предка до потомка, затем инсерчу в мап, затем сливаю мап как объект?
2)
сама ф-ция serialize шаблонная, в моем случае в мап сохраняется указатель на базовый класс, как ее(serialize)
сделать виртуальной, делать ли вообще?

Добавлено через 7 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
int main()
{
* * ofstream ofs("filename.bin");
* * Office of("pencil", "pen");
* * //of.Print();
* * boost::archive::text_oarchive oa(ofs);
* * oa << of;
* * ofs.flush(); // здесь
//......
}
DrOffset,
Заработало!!!!!
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
12.02.2016, 14:47
Лучший ответ Сообщение было отмечено anti-k как решение

Решение

Цитата Сообщение от anti-k Посмотреть сообщение
как ее(serialize) сделать виртуальной, делать ли вообще?
Можно сделать. Для этого нужно ее сделать нешаблонной, задав конкретный тип архива.
C++
1
2
3
4
5
6
7
8
9
10
    virtual void serialize(boost::archive::text_iarchive & ar, const unsigned int version)
    {
        Tovar::serialize(ar, version);
        ar & name;
    }
    virtual void serialize(boost::archive::text_oarchive & ar, const unsigned int version)
    {
        Tovar::serialize(ar, version);
        ar & name;
    }
Насчет "нужно" - это сам решай. От задачи зависит.
2
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
12.02.2016, 14:49  [ТС]
DrOffset, Спасибо огромное!!!
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
12.02.2016, 14:55
Цитата Сообщение от anti-k Посмотреть сообщение
Я сериализую всю иерархию от предка до потомка
Если тебе именно это нужно, то да.

Не по теме:

Цитата Сообщение от anti-k Посмотреть сообщение
Спасибо огромное!!!
Не за что :)

1
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
12.02.2016, 16:29  [ТС]
DrOffset, Не могли бы ли вы еще просветить по такому вопросу, я прописал сериализацию по више описанному шаблону. Все тип-топ!!
Но вот дальше застрял.
C++
1
Tovar*=new Office("st1","st2");
Как применить эту всю сериализацию?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
12.02.2016, 16:36
Цитата Сообщение от anti-k Посмотреть сообщение
Как применить эту всю сериализацию?
Как обычно:
C++
1
2
3
    Tovar * t = new Office("st1", "st2");
    boost::archive::text_oarchive oa(ofs);
    oa << *t;
1
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
12.02.2016, 16:43  [ТС]
DrOffset,
Записывает славно, с считыванием чего то не так
C++
1
2
3
4
5
6
7
8
9
10
11
12
ofstream ofs("file1111.bin");
    Tovar*ob = new Office("2001-10-11", "pen");
    boost::archive::text_oarchive oa(ofs);
    oa << *ob;
 
    ofs.flush();
 
    Tovar*newg=nullptr;
    ifstream ifs("file1111.bin");
    boost::archive::text_iarchive ia(ifs);
    ia >> *newg;
    newg->Print();
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
12.02.2016, 16:56
Цитата Сообщение от anti-k Посмотреть сообщение
с считыванием чего то не так
Конечно не так.
Предыдущую тему помнишь? Я там показывал как надо
Объект-то класса кто за тебя будет создавать?

Добавлено через 1 минуту
C++
1
2
3
4
5
    Tovar * newg = new Office();
    ifstream ifs("file1111.bin");
    boost::archive::text_iarchive ia(ifs);
    ia >> *newg;
    newg->Print();
1
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
13.02.2016, 10:43  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
"Читай про сериализацию."
Предыдущую тему помню

C++
1
2
3
4
5
Tovar*newg=new Office();
    ifstream ifs("file1111.bin");
    boost::archive::text_iarchive ia(ifs);
    ia >>*newg;
    newg->Print();
Заработало, ошибку в думаю что понял

Добавлено через 17 часов 35 минут
В продолжение " Cаги о сериализации..."
Не правильно оно как то сливает этот мап, подскажите что не так/

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ofstream f("Save.bin");//, ios::binary);
    if (f.fail())
        cerr << "fail\n";
    boost::archive::text_oarchive oa(f);
    oa & src;
 
    f.flush();
 
    multimap<string, Office>src1;
 
 
    ifstream f1("Save.bin");//, ios::binary);
    if (f1.fail())
        cerr << "fail\n";
    boost::archive::text_iarchive oa1(f1);
    oa1&src1;
    for (auto it = src1.begin(); it != src1.end();++it)
    {
        it->second.Print();
    }
Добавлено через 4 минуты
Мосье DrOffset, в своем решении как то использует reference_wrapper
C++
1
2
3
4
5
template <class archive>
void serialize(archive& ar, std::reference_wrapper<Connection> ref, const unsigned int version)
{
    ref.get().serialize(ar, version);
}
Думаю что и мне необходимо таким путем решать, читаю вот туториал но все не то
0
13.02.2016, 10:45

Не по теме:

Цитата Сообщение от anti-k Посмотреть сообщение
подскажите что не так
Я думаю тут все очевидно, ты не приложил полный и компилируемый код со своей проблемой, а телепаты все в отпусках :)

0
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
13.02.2016, 10:59  [ТС]
DrOffset,
Категорически приветствую!!!
В коде застрял на вчерашнем месте...
Я сейчас все по максимуму упрощу и выложу

Добавлено через 8 минут
Базовый класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Tovar
{
public:
    Tovar(string s = "", string s1 = "") :type(s), d(s1) {}
    virtual void Print()const { 
        date dd(from_string(d));
        cout << type << " " << dd;// from_string(d);
    }
    virtual string GetIndex()const { return d; };
    ~Tovar();
private:
    friend class boost::serialization::access;
    template<typename Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & type;
        ar & d;
    }
    string type;
    string d;
};
Потомок
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Office:public Tovar
{
public:
    Office(string s1 = "", string s2 = "") :Tovar("office", s1), name(s2) {};
    void Print()const { Tovar::Print(); cout << " " << name << "\n"; }; 
    string GetIndex()const { return Tovar::GetIndex(); };
    ~Office();
private:
    friend class boost::serialization::access;  
    template<class Archive> 
    void serialize(Archive & ar, const unsigned int version)
    //virtual void serialize(boost::archive::text_oarchive & ar, const unsigned int version)
    {       
        ar & boost::serialization::base_object<Tovar>(*this);
        ar & name;      
    }
    string name;
};
есть фабрика
C++
1
2
3
4
5
6
7
8
9
class OfficeFactory : public Factory
{
public:
 
    shared_ptr<Tovar> createTovar(const string& s, const string& s1) {
        return make_shared<Office>(s, s1);
    }
 
};
и склад
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
class Slklad
{
public:
    friend class boost::serialization::access;
    multimap<string, shared_ptr<Tovar>>office;
    multimap<string, shared_ptr<Tovar>>build;
 
    void Show(const multimap<string, shared_ptr<Tovar>>&ob)const
    {
        for (auto i = ob.begin(); i != ob.end(); ++i)
        {
            date today = day_clock::local_day();
            cout << today - from_string(i->first) << "\n";
        }
    }
 
 
    
 
    void Write()
    {
        ofstream ofs("fffffff.bin");
        boost::archive::text_oarchive oa(ofs);
        for (auto it = office.begin(); it != office.end(); ++it)
        {           
            oa& *(it->second.get());
        }
    }
    /*void Read()
    {
        ifstream ifs("fffffff.bin");
        boost::archive::text_iarchive ia(ifs);          
        
        while (true)
        {
            Tovar*ob = new Office();                    
            ia&*ob; 
            if (ifs.eof())
                break;
            ob->Print();
            delete ob;
        }
    }*///read????
    Slklad();
    ~Slklad();
};
так вот про склад, по итератору пишет в бинарник Write();
Read() на консоль читает, но кидает ексепшин(она вообще бесполезня писал чисто что бы проверить записал ли Write())

Проблемма номер раз - будет ли адекватно сереализовать shared_ptr

Как дампом слить и считать multimap
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
13.02.2016, 17:20
Лучший ответ Сообщение было отмечено anti-k как решение

Решение

Цитата Сообщение от anti-k Посмотреть сообщение
будет ли адекватно сереализовать shared_ptr
Будет. Нужно только зарегистрировать нужный вариант (см. пример).

Цитата Сообщение от anti-k Посмотреть сообщение
Как дампом слить и считать multimap
Подключить serialization/map.hpp, чтобы заработало.

Цитата Сообщение от anti-k Посмотреть сообщение
кидает ексепшин(
Для полиморфной сериализации класс должен быть полиморфным (иметь хотя бы одну виртуальную функцию).
Кроме этого нужно зарегистрировать производные классы (см. пример).

В качестве ответа на все вопросы, пример:
Кликните здесь для просмотра всего текста

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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <iostream>
#include <fstream>
#include <string>
#include <memory>
 
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>
 
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
 
#include <boost/serialization/export.hpp>
 
#include <boost/serialization/shared_ptr.hpp>
#include <boost/serialization/map.hpp>
 
class Base
{
public:
    explicit Base(std::string const & name = "")
        : m_name(name)
    { }
 
    virtual ~Base() {}
 
    virtual void show(std::ostream & out) const
    {
        out << "Name: " << m_name << ' ';
    }
 
private:
    friend class boost::serialization::access;
 
    template <typename Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & BOOST_SERIALIZATION_NVP(m_name);
    }
 
private:
    std::string m_name;
};
 
class Derived
    : public Base
{
public:
    explicit Derived(std::string const & n = "", std::string const & d = "", std::string const & t = "")
        : Base(n), m_data(d), m_type(t)
    { }
 
    virtual void show(std::ostream & out) const
    {
        Base::show(out);
        out << "Data: " << m_data << ' ';
        out << "Type: " << m_type << ' ';
    }
 
private:
    friend class boost::serialization::access;
 
    template <typename Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base);
        ar & BOOST_SERIALIZATION_NVP(m_data);
        ar & BOOST_SERIALIZATION_NVP(m_type);
    }
 
private:
    std::string m_data;
    std::string m_type;
};
 
BOOST_CLASS_EXPORT(Derived);
BOOST_SERIALIZATION_SHARED_PTR(Derived);
 
int main()
{
    { // save
        std::ofstream ofx("test.txt");
        boost::archive::text_oarchive archive(ofx);
 
        std::multimap<std::string, std::shared_ptr<Base>> test_map;
 
        test_map.insert(std::make_pair("test1", std::make_shared<Derived>("1", "2", "3")));
        test_map.insert(std::make_pair("test2", std::make_shared<Derived>("3", "4", "5")));
        test_map.insert(std::make_pair("test3", std::make_shared<Derived>("6", "7", "8")));
 
        archive << BOOST_SERIALIZATION_NVP(test_map);
    }
 
    { // load
        std::ifstream ifx("test.txt");
        boost::archive::text_iarchive archive(ifx);
 
        std::multimap<std::string, std::shared_ptr<Base>> test_map;
 
        archive >> BOOST_SERIALIZATION_NVP(test_map);
 
        for(auto & cu : test_map)
        {
            std::cout << cu.first << ' ';
            cu.second->show(std::cout);
            std::cout << '\n';
        }
    }
}
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.02.2016, 17:20
Помогаю со студенческими работами здесь

Вопрос по сериализации
здравствуйте, не могли бы вы мне обьяснить чем отличается сериализация от простой записи в бинарный файл? и еще для чего нужна переменная...

методы сериализации
помогите найти что-то по этой теме

Механизм сериализации
1. Описать класс, и предусмотреть для него возможность сериализации. 2. Создать массив объектов класса, и сериализововать их в файл. 3....

По поводу сериализации
Когда я сериализую обьект, в котором вложены другие объекты разных типов классов, а потом его десериализую и присваиваю новому обьекту (как...

Ошибка сериализации
Здравствуйте! Приложение выбрасывает исключение и я не могу понять почему:В месте: lock (sLock) { bmp =...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru