Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > сериализация/десериализация


Автор: zss 4.5.2006, 22:10
есть структура, которая содержит в себе вложенные структуры. Их количество может быть любым (в этом и сложность)

например, если на STL то примерно так
Код

struct A{
    int a;
    std::string name;
};

struct B{
    std::vector<unsigned char> vec;
    std::list<B> list_a;
};

class C;
struct D{
    std::map<unsigned char, C> map_c;
    std::list<B> list_b;
};


как быстро осуществить сериализацию ?

2. Размер выше приведенных структур фиксирован, но не фиксированно их число
Но еще у меня есть структура, которая имеет заголовок
struct Header{
    unsigned size;
}

который определяет число элементов, следующих сразу за ней
их тип unsigned short. Тоесть число элементов может быть любым

Как тогда в этом случае?

З.Ы. И десериализация тоже интерисует 

Автор: Void 4.5.2006, 23:39
zss, стоит наверное взглянуть на реализацю http://www.boost.org/libs/serialization/doc/index.html. По крайней мере, со стандартными контейнерам она работать умеет и простор для пользовательской реализации предоставляет. Насчет скорости ничего существенного сказать не могу.

Думаю, если в сериализуемоем графе объектов нет циклов, реализацию можно сильно упростить. 

Автор: zss 4.5.2006, 23:56
Void, чесно говоря не совсем понял как его юзать smile 
Можно пояснить, если не сложно

З.Ы. есть еще одна сложность - иногда мне нужно серелиазовать не всю структуру целиком, а только ее срез

например
Код

struct S{
    unsigned s1;
    unsigned s2;
    unsigned s3;
    unsigned s4;
}


то нужно только 
Код

struct S{
    unsigned s1;
    unsigned s3;
}


Это реально ? (или руками придется)
 

Автор: Daevaorn 5.5.2006, 01:08
Цитата(zss @  5.5.2006,  00:56 Найти цитируемый пост)
Это реально ? (или руками придется)

Руками придется в любом случае. Те поля которые нужно сериализовать ты будешь указывать сам. Поэтому гибкость большая. 

Автор: Void 5.5.2006, 17:33
Пример частичной сериализации структры на Boost.Serialization:
Код
#include <fstream>
#include <string>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>

struct S {
    bool flag;
    unsigned s1, s2, s3, s4;
    
private:
    friend class boost::serialization::access;
    
    template <class Archive>
    void serialize(Archive &ar, const unsigned /* version */) {
        ar & flag & s1 & s2;
        if (flag)
            ar & s3 & s4;
    }
};

int main() {
    S a = { true, 1, 2, 3, 4 };
    S b = { false, 11, 12 };

    std::string filename = "test.dat";

    std::ofstream ofs(filename.c_str(), std::ios_base::binary);
    boost::archive::binary_oarchive oa(ofs);
    // explicit cast to const is necessary due to library
    // architecture
    oa << static_cast<const S&>(a) << static_cast<const S&>(b);
    ofs.close();
    
    std::ifstream ifs(filename.c_str(), std::ios_base::binary);
    boost::archive::binary_iarchive ia(ifs);
    ia >> a >> b;
    ifs.close();
}
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)