Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сериализация/десериализация 
:(
    Опции темы
zss
Дата 4.5.2006, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: 1
Всего: 2



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

например, если на 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. Тоесть число элементов может быть любым

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

З.Ы. И десериализация тоже интерисует 
PM MAIL ICQ   Вверх
Void
Дата 4.5.2006, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



zss, стоит наверное взглянуть на реализацю Boost.Serialization. По крайней мере, со стандартными контейнерам она работать умеет и простор для пользовательской реализации предоставляет. Насчет скорости ничего существенного сказать не могу.

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


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
zss
Дата 4.5.2006, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: 1
Всего: 2



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

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

например
Код

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


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

struct S{
    unsigned s1;
    unsigned s3;
}


Это реально ? (или руками придется)
 
PM MAIL ICQ   Вверх
Daevaorn
Дата 5.5.2006, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



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

Руками придется в любом случае. Те поля которые нужно сериализовать ты будешь указывать сам. Поэтому гибкость большая. 
PM MAIL WWW   Вверх
Void
Дата 5.5.2006, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Пример частичной сериализации структры на 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();
}
 


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0735 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.