![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| zss |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
есть класс
1. как сереализовать/десереализовать Ch. Или для него тоже нужно использовать метод serialize ? 2. Нужно ли вообще в serialize сереализовать встроенные типы на следующий код
выдается куча варнингов, типа не могу преобразовать size_t в std::streamsize - причем это из boost 3. Что я делаю не так ? 4. Нужны ли ообще методы save и load ? 5. Что-то не получается записать это в xml (в бинарный поток вроде получилось). Это сообщение отредактировал(а) zss - 22.12.2006, 13:15 |
||||
|
|||||
| Любитель |
|
||||||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Лучше всего да. Можно, конечно, предоставить паблик-функции для установки твоей карты, но это будет хуже. Не понял вопроса. Если ты про int и прочее - то, безусловно, да. Ведь у тебя в классе вполне могут быть поля, которые вообще не требуют среиалзации (может какие-то промежуточные кэшируемые данные и пр).
Лучшего решения, чем забить на них предложить не могу. Эти типы различаются лишь signed/unsigned. Преобразования между ними необходимы. Если хочешь, можешь в заголовках буста постаить проверку компилятора на VC++ и поставить игнор варнингов. Вконце вернуть обратно. Это насчёт варнингов? Вообще нужны
Поподробней можно? Какие-то ошибки компиляции или в рантайме вылетает? Будем разбираться (ведём пропаганду буста в массы) |
||||||
|
|||||||
| zss |
|
||||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
чесно говоря я попробовал определить метод serialize для него типа
но почему-то говорит,что для std::vector нет метода serialize
имеется ввиду. что для структуры имеющей одни int приходится определять serialize, что странно....
ну такая мощная библиотека, да ее имещая в своем руководстве многих членов комитета по стандартизазии ... очеь обидная ошибка....
Но это будет действовать только на boost? если да, то что именно нужно отключить ? тоесть их можно не переопределять ? если чесно - взял из примера, т.к. очень мало документации по boost
чесно говоря ничего не понял
если варнинги исчезнут, то скину ошибки по xml, а то там до утра их можно искать |
||||||||||||||
|
|||||||||||||||
| Любитель |
|
||||||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Странно, по идее должно (проверить как всегда не могу
Повторюсь - при сериализации используется минимум полей, достаточный для восстановления объекта. При работе их может быть больше - ради оптимизации скорости.
Сие делается в заголовка буста. Что-то вроде:
Можно добавить для других компилеров (Многие реализуют директивы отключения варнингов). В твоём случае абсолютно не нужно. лоад/сейв определяются когда у тебя разные загрузка и сохранение (такое возможно). Для этого же нужен макрос сплита мемберов. У тебя же в классе парсера вообще нет сериализации как таковой, он сериализует лишь своё поле. То, что твои методы называются (De)Serialize ничего не значит. Они не принимают архивов в качестве параметров. Не понял. Ты же в студии работаешь? Отключи кнопку "Warnings" в эррор-листе. |
||||||
|
|||||||
| zss |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
включил
тоесть можно определить метод, но не реализовывать его ? спасибо
но без их определения не варится |
||||||
|
|||||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
вроде с этим разобрался
Но есть еще одна проблемма с которой я не могу справиться. Если я использую для записи 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 запихеуть ? |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
zss, XML архивы требуют пар: "имя => значение". В терминологии бустовской сериализации это называется nvp - name-value pair. Для создания пары есть фукнция make_nvp (шаблонная). Также полезен макрос BOOST_SERIALIZATION_NVP. Он принимает один параметр (имя переменной) и раскрывается в вызов make_nvp с именем - строкой, представляющий из себя имя переменной. Важно заметить, что все остальные типы архивов встречая nvp используют только значение, то есть за лишнюю инфу при сериализации можно не беспокоиться.
|
|||
|
||||
| zss |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
понятно - вроде заработало
а можно ли сериализовать вектор в таким образом, чтоб он представлял std::vector не как
а как
тоесть ввиде строки и каждый элемент в 2-x символьный HEX Это сообщение отредактировал(а) zss - 27.12.2006, 21:27 |
||||
|
|||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Можно в принципе. Но либо тебе надо создавать свой архив, либо переопределить сериализацию вектора, либо в своей сериализации вектор сериализовать поэлементно.
|
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
понятно. Остался полседний вопросик (2 вопросика
1. Как сериализуются классы при наследовании (базовые классы) 2. Как из сериализованного архива вытащить массив байт (или std::vector<unsigned char>) |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
1. При наследовании в методе сериализации потомка вначале вызови:
Где T - тип предка, у которого реализована сериализация. 2. Несовсем понял вопроса - можешь пример? |
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
||||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Если тебе нужны бинарные данные - бинарный архив. Другой вариант - метод у объекта для передачи по сети. Интересное решение - создать свой архив (возможно, на базе binary_archive - надо смотреть), который при сериализации будет осуществлять приём/передачу по сети. Возможна поддержка кэширование и передача блоками определённой длины.
|
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
а как из него двнные достать ? можно немного подробнее ? З.Ы. Пример простой. Есть список векторов std::list<std::vector<unigned char> > нужно прилепить к нему свой заголовок (байт 20) и отпрвить по сети. В идеале бы конечно хотелось, чтоб после сериализации получился обычный вектор (чтоб проще отправлять было) |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Всмысле? Классически.
Насчёт архива с отправкой по сети. К сожалению, сейчас я совсем дома, компилера никакого у меня тут нету, а сие всё же писать на коленках не берусь. 9-го числа поеду в Воронеж (сессия, сессия...) - постараюсь написать. |
|||
|
||||
| zss |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
буду признателен только не совсем понятно чем отличается передача по сети. Если удасться сериализовать этот список и получить из него массив байт, то дальше дело техники. не совсем понял. тоесть можно так ? 1. На одной стороне
А на другой
так что-ли ? мне просто сама идея не совсем понятна для обычных контейнеров |
||||
|
|||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
Любитель, хотелось бы увидеть решение |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
zss, извиняюсь - задерживаюсь. Постараюсь быстрее.
ЗЫ У кого к завершению, а кому ещё зачёт по матану надо получить. Про экзамен я молчу... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |