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


Автор: knut 10.7.2007, 14:59
Есть некий класс 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)
{

}



прав я?

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

Автор: jonie 11.7.2007, 02:15
как написать "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(

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

достаточно написать соответствующий оператор для потока и вектора. в наследовании и написаниии нового вектора необходимости нет.

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