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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сериализация 
:(
    Опции темы
knut
Дата 10.7.2007, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть некий класс cFor_Save надо соxранить обект этого класса в фаил.
Код

template<class T>
class cFor_Save
{
public:
    cFor_Save(){};
    ~cFor_Save(){};
public:
    int my_object_1;
    std::string my_str;
    std::vector<cPlayerCondition*>m_my_vector;
    typedef void(T::*Mem_Fun)(void);
};

действие.
1.перегружаем для класса каторый надо соxранить операторы << и >>.
2.Создаем 2 функции 
а.void Load_File(LPCTSTR file_name);
б.void Save_File(LPCTSTR file_name);
типа так?
Код

template<class T>
class cStream_
{
public:

    cStream_(){};
    ~cStream_(){};
public:
    std::ostream & operator << (std::ostream &os,const cFor_Save<T> &stream_)
    {
            os << stream_.my_object_1;
            os << stream_.my_str;
            ....
                //это для обектов а как для вектороа(m_my_vector) оператор  << реализовать ? так же?
                std::vector<cPlayerCondition*>::iterator it = m_vector.begin();
            for(it;it!=m_vector.end();++it)
            {
                os << (*it);
            }
            
            return os;
    }
    std::istream & operator >> (std::istream & is,cFor_Save<T> &stream)
    {
            is >> stream_.my_object_1;
            is >> stream_.my_str;
            //...
         return is;
    }
    void Load_File(LPCTSTR file_name);
    void Save_File(LPCTSTR file_name);



};

template<class T>
void cStream_::Load_File(LPCTSTR file_name)
{
    
}
template<class T>
void cStream_<T>::Save_File(LPCTSTR file_name)
{

}



прав я?



--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
Xenon
Дата 10.7.2007, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 11
Всего: 50



knut, у тебя в цикле сериализуются указатели, а не объекты. 
Ты в файл засунь сначала, допустим, все POD типы, затем размер вектора m_vector, а затем все элементы вектора.


--------------------
user posted image  
PM MAIL   Вверх
jonie
Дата 11.7.2007, 02:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



как написать "obj<<vector" (чтобы убрать цикл)) ? написать свой вектор где эти операци перегрузить... можно отнаследовать от std::vector свой класс...
далее можно будет писать ... ну и , конечно, перегрузить << для объектов содержащихся в векторе.
_______________

а я когда-то делал замудрнее много.
для моей сериализации не надо было писать подобные методы...
было :
1)базовый класс ISerilizable.
1.1) в нем void SerilizeSetup()=0; -- в ней заполнялась внутреняя карта std::map<string,PROPERTY>
были наляпаны макросы, поэтому вся реализация этого метода в потомках выглядела как 
Код

BEGIN_SERIALIZE_MAP
  SERIALIZE_INT(data);
.......
END_SERIALEZE_MAP

1.1.1)где PROPERTY - была структура вида {void* lpMemory, size_t memSize, тип_памяти, тип_ссылаемого_объекта,PROPERTY* lpMemorySingle }, где тип_памяти - статическая\динамическая (при сериализации класс сам захватывал память), тип_ссылаемого_объекта - тип того что можно сериализовать (классы унаследованные от ISerilizable, массивы объектов, базовые типы, некоторые STL-вские типы..),lpMemorySingle - указатель на описатель "элемента", если сам элемент был массивом (т.е. поддерка массива-массивов-массивов...), ну и еще были поля типа нужноли изменять значения под указателем lpMemory в случае динамического элемента (например была сериализация char* data, Где передавался &data - его менять надо, а вот char** data - в ней "второй ярус" уже можно расставлять самому..)
1.2) класс содержал два метода обственно сериализации и десериализации. При их вызове был вызов SerilizeSetup() и далее (де)сериализация сама.

работало это довольно "красиво"... невозможно было например десериализовать классы динамические (невозможно вызвать конструкторы и заполнить __vpft)....ну и еще были проблемы) но это работало как говорится "с ходу"...да еще и подстыковав самопальный dataaldpter можно было сериализовать хоть куда (было реализовано правда только XML)...

финальная версия, к сожалению, была утеряна мной всвязи с падением SVN репозитория 8(

Это сообщение отредактировал(а) jonie - 11.7.2007, 02:16


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Daevaorn
Дата 11.7.2007, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(jonie @  11.7.2007,  03:15 Найти цитируемый пост)
как написать "obj<<vector" (чтобы убрать цикл)) ? написать свой вектор где эти операци перегрузить... можно отнаследовать от std::vector свой класс...
далее можно будет писать ... ну и , конечно, перегрузить << для объектов содержащихся в векторе.

достаточно написать соответствующий оператор для потока и вектора. в наследовании и написаниии нового вектора необходимости нет.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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