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

Поиск:

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


Опытный
**


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

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



есть класс
Код

class Ch
{
private :
    std::vector<unsigned char> m_vec;
public:
   ...
}

struct CmxSettings
{
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & value;
        ar & count;
        ar & ch;
    }

    int value;
    int count;
    Ch ch;
};


1. как сереализовать/десереализовать Ch. Или для него тоже нужно использовать метод serialize ?
2. Нужно ли вообще в serialize сереализовать встроенные типы
на следующий код
Код

class Parser : private NonCopy {
private :

    friend class boost::serialization::access;

    template <class Archive>
    void save (Archive& archive, const unsigned int version) const
    {
    }
    template <class Archive>
    void load (Archive& archive, const unsigned int version)
    {
    }

    BOOST_SERIALIZATION_SPLIT_MEMBER()

    typedef std::map <std::string, CmxSetting> MapType;
    typedef std::pair<std::string, CmxSetting> PairType;

    std::string m_fname;
    MapType m_settings;

    void Serialize (void) const
    {
        std::ofstream stream (m_fname.c_str(), std::ios_base::binary);
        boost::archive::binary_oarchive archive (stream);
        archive << m_settings;
        stream.close();
    }
    void Deserialize (void)
    {
        std::ifstream stream (m_fname.c_str(), std::ios_base::binary);
        boost::archive::binary_iarchive archive (stream);
        archive >> m_settings;
        stream.close();
    }

public :
    explicit Parser (const std::string& name) : m_fname (name)
    {
        Serialize();
    }
    ~Parser ()
    {
        Deserialize();
    }
};


выдается куча варнингов, типа не могу преобразовать size_t в std::streamsize - причем это из boost

3. Что я делаю не так ?
4. Нужны ли ообще методы save и load ?
5. Что-то не получается записать это в xml (в бинарный поток вроде получилось).

Это сообщение отредактировал(а) zss - 22.12.2006, 13:15
PM MAIL ICQ   Вверх
Любитель
Дата 23.12.2006, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Цитата(zss @  22.12.2006,  13:12 Найти цитируемый пост)
1. как сереализовать/десереализовать Ch. Или для него тоже нужно использовать метод serialize 

Лучше всего да. Можно, конечно, предоставить паблик-функции для установки твоей карты, но это будет хуже.

Цитата(zss @  22.12.2006,  13:12 Найти цитируемый пост)
Нужно ли вообще в serialize сереализовать встроенные типы

Не понял вопроса. Если ты про int и прочее - то, безусловно, да. Ведь у тебя в классе вполне могут быть поля, которые вообще не требуют среиалзации (может какие-то промежуточные кэшируемые данные и пр).

Цитата(zss @  22.12.2006,  13:12 Найти цитируемый пост)
выдается куча варнингов, типа не могу преобразовать size_t в std::streamsize

Лучшего решения, чем забить на них предложить не могу. Эти типы различаются лишь signed/unsigned. Преобразования между ними необходимы. Если хочешь, можешь в заголовках буста постаить проверку компилятора на VC++ и поставить игнор варнингов. Вконце вернуть обратно.

Цитата(zss @  22.12.2006,  13:12 Найти цитируемый пост)
Что я делаю не так ?

Это насчёт варнингов?

Цитата(zss @  22.12.2006,  13:12 Найти цитируемый пост)
Нужны ли ообще методы save и load 

Вообще нужны  smile Не зря же их придумали... Н в твоём случае - нет. Также как и BOOST_SERIALIZATION_SPLIT_MEMBER. Сама среиализация у тебя расположена в CmxSettings, потому в твоём парсере ты лишь юзаешь её, а не реализуешь.

Цитата(zss @  22.12.2006,  13:12 Найти цитируемый пост)
Что-то не получается записать это в xml (в бинарный поток вроде получилось).

Поподробней можно? Какие-то ошибки компиляции или в рантайме вылетает? Будем разбираться (ведём пропаганду буста в массы)  smile 



--------------------
PM MAIL ICQ Skype   Вверх
zss
Дата 23.12.2006, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Любитель @  23.12.2006,  16:37 Найти цитируемый пост)
Лучше всего да. Можно, конечно, предоставить паблик-функции для установки твоей карты, но это будет хуже

чесно говоря я попробовал определить метод serialize для него типа
Код

class Ch
{
private :
    std::vector<unsigned char> m_vec;

    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & m_vec;
    }

public:
   ...
}



но почему-то говорит,что для std::vector нет метода serialize


Цитата(Любитель @  23.12.2006,  16:37 Найти цитируемый пост)
Не понял вопроса. Если ты про int и прочее - то, безусловно, да

имеется ввиду. что для структуры имеющей одни int приходится определять serialize, что странно....

Цитата(Любитель @  23.12.2006,  16:37 Найти цитируемый пост)
Лучшего решения, чем забить на них предложить не могу. Эти типы различаются лишь signed/unsigned

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


Цитата(Любитель @  23.12.2006,  16:37 Найти цитируемый пост)
Если хочешь, можешь в заголовках буста постаить проверку компилятора на VC++ и поставить игнор варнингов. Вконце вернуть обратно.

Но это будет действовать только на boost? если да, то что именно нужно отключить ?
Цитата(Любитель @  23.12.2006,  16:37 Найти цитируемый пост)
Вообще нужны   Не зря же их придумали... Н в твоём случае - нет

тоесть их можно не переопределять ?
Цитата(Любитель @  23.12.2006,  16:37 Найти цитируемый пост)
Также как и BOOST_SERIALIZATION_SPLIT_MEMBER

если чесно - взял из примера, т.к. очень мало документации по boost smile


Цитата(Любитель @  23.12.2006,  16:37 Найти цитируемый пост)
Сама среиализация у тебя расположена в CmxSettings, потому в твоём парсере ты лишь юзаешь её, а не реализуешь.

чесно говоря ничего не понял smile
Цитата(Любитель @  23.12.2006,  16:37 Найти цитируемый пост)
Поподробней можно? Какие-то ошибки компиляции или в рантайме вылетает? Будем разбираться (ведём пропаганду буста в массы) 

если варнинги исчезнут, то скину ошибки по xml, а то там до утра их можно искать smile
PM MAIL ICQ   Вверх
Любитель
Дата 24.12.2006, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Цитата(zss @  23.12.2006,  23:52 Найти цитируемый пост)
но почему-то говорит,что для std::vector нет метода serialize

Странно, по идее должно (проверить как всегда не могу  smile ). Полпробуй инклюд <boost/serialization/vector.hpp>.

Цитата(zss @  23.12.2006,  23:52 Найти цитируемый пост)
имеется ввиду. что для структуры имеющей одни int приходится определять serialize, что странно....

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

Цитата(zss @  23.12.2006,  23:52 Найти цитируемый пост)
Но это будет действовать только на boost? если да, то что именно нужно отключить

Сие делается в заголовка буста. Что-то вроде:
Код

#ifdef _MSC_VER // компилер - VC++ или Intel C++ for Windows
#    pragma warning(disable: ...) // вставь номер варнинга
#endif

// в конце хейдера
#ifdef _MSC_VER
#    pragma(default: ...)
#endif

Можно добавить для других компилеров (Многие реализуют директивы отключения варнингов).

Цитата(zss @  23.12.2006,  23:52 Найти цитируемый пост)
тоесть их можно не переопределять ?

В твоём случае абсолютно не нужно. лоад/сейв определяются когда у тебя разные загрузка и сохранение (такое возможно). Для этого же нужен макрос сплита мемберов. У тебя же в классе парсера вообще нет сериализации как таковой, он сериализует лишь своё поле. То, что твои методы называются (De)Serialize ничего не значит. Они не принимают архивов в качестве параметров.

Цитата(zss @  23.12.2006,  23:52 Найти цитируемый пост)
скину ошибки по xml, а то там до утра их можно искать 

Не понял. Ты же в студии работаешь? Отключи кнопку "Warnings" в эррор-листе.



--------------------
PM MAIL ICQ Skype   Вверх
zss
Дата 24.12.2006, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Любитель @  24.12.2006,  11:18 Найти цитируемый пост)
Странно, по идее должно (проверить как всегда не могу   ). Полпробуй инклюд <boost/serialization/vector.hpp>.

включил smile таже бодяга


Цитата(Любитель @  24.12.2006,  11:18 Найти цитируемый пост)
Повторюсь - при сериализации используется минимум полей, достаточный для восстановления объекта. При работе их может быть больше - ради оптимизации скорости.

тоесть можно определить метод, но не реализовывать его ?
Цитата(Любитель @  24.12.2006,  11:18 Найти цитируемый пост)
Сие делается в заголовка буста. Что-то вроде:

спасибо


Цитата(Любитель @  24.12.2006,  11:18 Найти цитируемый пост)
В твоём случае абсолютно не нужно. лоад/сейв определяются когда у тебя разные загрузка и сохранение 

но без их определения не варится


PM MAIL ICQ   Вверх
zss
Дата 25.12.2006, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вроде с этим разобрался smile

Но есть еще одна проблемма с которой я не могу справиться.
Если я использую для записи boost::archive::binary_oarchive, то вроде все нормально
А вот если boost::archive::xml_oarchive 
[ccode]
    std::ofstream stream (m_fname.c_str(), std::ios_base::binary);
    if (!stream.is_open()) return;
    boost::archive::xml_oarchive archive (stream);
    archive << ...;
    stream.close();
[/ccode]

то вываливается ошибка

[ccode]
c:\boost\boost\archive\basic_xml_oarchive.hpp(86) : error C2027: use of undefined type 'boost::STATIC_ASSERTION_FAILURE<x>'
        with
        [
            x=false
        ]
        c:\boost\boost\archive\detail\interface_oarchive.hpp(78) : see reference to function template instantiation 'void boost::archive::basic_xml_oarchive<Archive>::save_override<T>(T &,int)' being compiled
        with
        [
            Archive=boost::archive::xml_oarchive,
            T=const XmlParser::MapType
        ]
[/ccode]

подключение boost/static_assert не помогает. Как правильно в xml запихеуть ?
PM MAIL ICQ   Вверх
Любитель
Дата 27.12.2006, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



zss, XML архивы требуют пар: "имя => значение". В терминологии бустовской сериализации это называется nvp - name-value pair. Для создания пары есть фукнция make_nvp (шаблонная). Также полезен макрос BOOST_SERIALIZATION_NVP. Он принимает один параметр (имя переменной) и раскрывается в вызов make_nvp с именем - строкой, представляющий из себя имя  переменной. Важно заметить, что все остальные типы архивов встречая nvp используют только значение, то есть за лишнюю инфу при сериализации можно не беспокоиться.


--------------------
PM MAIL ICQ Skype   Вверх
zss
Дата 27.12.2006, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



понятно - вроде заработало smile

а можно ли сериализовать вектор в таким образом, чтоб он представлял 
std::vector не как 
Код

<m_vec>
    <count>3</count>
    <item>1</item>
    <item>3</item>
    <item>5</item>
</m_vec>


а как 
Код

<m_vec>01:03:05</m_vec>


тоесть ввиде строки и каждый элемент в 2-x символьный HEX

Это сообщение отредактировал(а) zss - 27.12.2006, 21:27
PM MAIL ICQ   Вверх
Любитель
Дата 28.12.2006, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Можно в принципе. Но либо тебе надо создавать свой архив, либо переопределить сериализацию вектора, либо в своей сериализации вектор сериализовать поэлементно.


--------------------
PM MAIL ICQ Skype   Вверх
zss
Дата 28.12.2006, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



понятно. Остался полседний вопросик (2 вопросика smile)

1. Как сериализуются классы при наследовании (базовые классы)
2. Как из сериализованного архива вытащить массив байт (или std::vector<unsigned char>)
PM MAIL ICQ   Вверх
Любитель
Дата 31.12.2006, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



1. При наследовании в методе сериализации потомка вначале вызови:
Код

boost::serialization::base_object<T>(*this);


Где T - тип предка, у которого реализована сериализация.


2. Несовсем понял вопроса - можешь пример?


--------------------
PM MAIL ICQ Skype   Вверх
zss
Дата 31.12.2006, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Любитель @  31.12.2006,  00:36 Найти цитируемый пост)
 Несовсем понял вопроса - можешь пример? 

в какой поток нужно сериализовать, чтоб мпожно былобы массив байт получить

Например для передачи этих данных через сокет (или через сокет можно еще как передать сериализованные данные ?)
PM MAIL ICQ   Вверх
Любитель
Дата 2.1.2007, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Если тебе нужны бинарные данные - бинарный архив. Другой вариант - метод у объекта для передачи по сети. Интересное решение - создать свой архив (возможно, на базе binary_archive - надо смотреть), который при сериализации будет осуществлять приём/передачу по сети. Возможна поддержка кэширование и передача блоками определённой длины.


--------------------
PM MAIL ICQ Skype   Вверх
zss
Дата 4.1.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Любитель @  2.1.2007,  18:37 Найти цитируемый пост)
Если тебе нужны бинарные данные - бинарный архив

а как из него двнные достать ?

Цитата(Любитель @  2.1.2007,  18:37 Найти цитируемый пост)
Интересное решение - создать свой архив (возможно, на базе binary_archive - надо смотреть), который при сериализации будет осуществлять приём/передачу по сети. Возможна поддержка кэширование и передача блоками определённой длины. 

можно немного подробнее ?

З.Ы. Пример простой. Есть список векторов std::list<std::vector<unigned char> >
нужно прилепить к нему свой заголовок (байт 20) и отпрвить по сети.
В идеале бы конечно хотелось, чтоб после сериализации получился обычный вектор (чтоб проще отправлять было)
PM MAIL ICQ   Вверх
Любитель
Дата 5.1.2007, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Цитата(zss @  4.1.2007,  16:23 Найти цитируемый пост)
а как из него двнные достать

Всмысле? Классически.
Код

ar >> my_vector;


Насчёт архива с отправкой по сети. К сожалению, сейчас я совсем дома, компилера никакого у меня тут нету, а сие всё же писать на коленках не берусь. 9-го числа поеду в Воронеж (сессия, сессия...) - постараюсь написать.


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


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

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