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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [boost] serialization и наследование 
:(
    Опции темы
cupper
Дата 24.12.2010, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Пытаюсь осилить сераализацию при наследовании классов. Документация меня окончательно запутала.
Имею следующую иерархию классов класс
Код

class Person
    {
        friend class boost::serialization::access;
        template<class Archive>
        void serialize(Archive&, const unsigned int);
        public: 
                 virtual ~Person() = 0;
};
    BOOST_SERIALIZATION_ASSUME_ABSTRACT(Person);


    template<class Archive>
    void Person::serialize(Archive& ar, const unsigned int version)
    {
        ar & BOOST_SERIALIZATION_NVP(_name);
        ar & BOOST_SERIALIZATION_NVP(_gender);
        ar & BOOST_SERIALIZATION_NVP(_birth);
    }
class Student :
        public Person
    {
        friend class boost::serialization::access;
        template<class Archive>
        void serialize(Archive&, const unsigned int);
    public:
        virtual ~Student();
};
template<class Archive>
    void Student::serialize(Archive& ar, const unsigned int version)
    {
        ar & boost::serialization::base_object<Person>(*this);
        ar.register_type(static_cast<Student *>(NULL));
        ar & BOOST_SERIALIZATION_NVP(_group);
        ar & BOOST_SERIALIZATION_NVP(_averageGrade);
    }
....
class ListPerson
    {
        friend class boost::serialization::access;
        template<class Archive>
        void serialize(Archive&, const unsigned int);
        
    public:
    private:
        std::list<boost::shared_ptr<Person> > _data;
    };
template<class Archive>
    void ListPerson::serialize(Archive& ar, const unsigned int version)
    {
        ar & BOOST_SERIALIZATION_NVP(_data);
    }

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

Ошибка    1    error C2338: typex::value    e:\utils\boost_1_45_0\boost\archive\detail\check.hpp    162    1    xxx

которая отправляет меня сюда
Код

template<class T>
inline void check_const_loading(){
    typedef
        BOOST_DEDUCED_TYPENAME mpl::or_<
            BOOST_DEDUCED_TYPENAME boost::serialization::is_wrapper< T >,
            BOOST_DEDUCED_TYPENAME mpl::not_<
                BOOST_DEDUCED_TYPENAME boost::is_const< T >
            >
        >::type typex;
    // cannot load data into a "const" object unless it's a
    // wrapper around some other non-const object.
--->    BOOST_STATIC_ASSERT(typex::value);
}


Сосбтвенно два вопроса:
1. Правильно ли я реализовал сериализацию к классах ?
2. Что за ошибка такая непонятная ?

Добавлено через 8 минут и 38 секунд
кажеться я регистриацию типом не туда добавил, сделал так
Код

template<class Archive>
    void ListPerson::serialize(Archive& ar, const unsigned int version)
    {
        ar.register_type(static_cast<Student *>(NULL));
        ar.register_type(static_cast<Teacher *>(NULL));
        ar & BOOST_SERIALIZATION_NVP(_data);
    }

Так правильно ?
Но ошибка не пропала.

Добавлено через 13 минут и 14 секунд
определил что ошибка связанная с этим кодом 
Код

void save(const std::string& filename, const ListPerson& listOfPerson)
    {
        std::ofstream ofs(filename);
        boost::archive::xml_oarchive oa(ofs);
        oa << BOOST_SERIALIZATION_NVP(listOfPerson);
        ofs.close();

    }
    void restore(const std::string& filename, const ListPerson& listOfPerson)
    {
        std::ifstream ifs(filename);
        boost::archive::xml_iarchive ia(ifs);
        ia >> BOOST_SERIALIZATION_NVP(listOfPerson);
        ifs.close();
    }

убрал его ошибки нет. Не монимаю что здесь не правильно ?

Это сообщение отредактировал(а) cupper - 24.12.2010, 13:16
PM MAIL   Вверх
cupper
Дата 24.12.2010, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



да пусть горит адским пламенем этот гребаный копипасть :( питался десериализовать данные в константные объект :(
Щас проверю как работает сам механизм сериализации, и если что тему можно использовать как пособие для поиска типичных ошибок smile

PS. для большей правдивости еще следует добавить, что делать надо вот так
Код

template<class Archive>
    void Student::serialize(Archive& ar, const unsigned int version)
    {
        ar & BOOST_SERIALIZATION_NVP(boost::serialization::base_object<Person>(*this));
        ar & BOOST_SERIALIZATION_NVP(_group);
        ar & BOOST_SERIALIZATION_NVP(_averageGrade);
    }


Это сообщение отредактировал(а) cupper - 24.12.2010, 13:38
PM MAIL   Вверх
cupper
Дата 24.12.2010, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Сериализация не сработала, в файл ничего не записалось, и еще вылетело исключение. Помогите найти ошибку в реализации сериализации.

При отлоче исключение и выводе what()
Код

Invalid XML tag name

вызывается тут
Код

void save(const std::string& filename, const ListPerson& listOfPerson)
    {
        std::ofstream ofs(filename);
        boost::archive::xml_oarchive oa(ofs);
--->        oa << BOOST_SERIALIZATION_NVP(listOfPerson);
        ofs.close();

    }


PS. уточнил более детально место ошибки
Код

template<class Archive>
    void Student::serialize(Archive& ar, const unsigned int version)
    {
->        ar & BOOST_SERIALIZATION_NVP(boost::serialization::base_object<Person>(*this));
        ar & BOOST_SERIALIZATION_NVP(_group);
        ar & BOOST_SERIALIZATION_NVP(_averageGrade);
    }


Если сериализовать просто базовый класс то это ошибку не вызывает.

PS. Урааа, ошибка была найдена и ликвидирована
Код

template<class Archive>
    void Student::serialize(Archive& ar, const unsigned int version)
    {
-->     ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Person);
        ar & BOOST_SERIALIZATION_NVP(_group);
        ar & BOOST_SERIALIZATION_NVP(_averageGrade);
    }


Это сообщение отредактировал(а) cupper - 24.12.2010, 15:31
PM MAIL   Вверх
cupper
Дата 24.12.2010, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



delete

Это сообщение отредактировал(а) cupper - 24.12.2010, 15:37
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0925 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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