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

Поиск:

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



****


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

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



как избавиться от какого-то префикса который пишется перед данными класса?

Код

#include <fstream>

#include <boost/archive/binary_oarchive.hpp>

struct Foo
{
    Foo(int x_):x(x_){}

    int x;

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

int main()
{
    using namespace std;

    Foo foo('qwer');

    ofstream os("out.bin",ios_base::binary|ios_base::out);
    
    boost::archive::binary_oarchive ar(os,boost::archive::no_header);

    int x='abcd';

    ar<<x;
    ar<<foo;

    return 0;
}


получается
"dcba", 00, 00,  "rewq"
а хотелось бы без этих двух нулевых байт, и чтоб конечно обратно читалось


Это сообщение отредактировал(а) GoldFinch - 1.7.2009, 19:11
PM MAIL ICQ   Вверх
jonie
Дата 1.7.2009, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



сколь я понимаю это сам "id класса". Ты можешь поставить брейкпоинт в basic_ostream::write и прогуляться по стеку в поисках того, кто пишет, наверняка там будет ответ и зачем...


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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(GoldFinch @  1.7.2009,  19:10 Найти цитируемый пост)
а хотелось бы без этих двух нулевых байт, и чтоб конечно обратно читалось

скорее всего, эти байты кодируют тип объекта и нужны для того, что-бы "обратно читалось" smile 
PM MAIL Skype GTalk   Вверх
GoldFinch
Дата 1.7.2009, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



мне больше кажется что это версия, хотя она unsigned int version
от этого избавитсья както можно? я хочу юзать буст::сериализацию для приема\отправки данных в готовую программу, и там не должно быть ничего лишнего

Добавлено через 5 минут и 47 секунд
а где кстати про буст почитать можно, кроме boost.org, а то там информации почти нет
PM MAIL ICQ   Вверх
bsa
Дата 2.7.2009, 12:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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




M
bsa
это в разделе для новичков?!?

PM   Вверх
GoldFinch
Дата 2.7.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



bsa, я новичек в бусте %)
PM MAIL ICQ   Вверх
GoldFinch
Дата 2.7.2009, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



немного потрассировав реализацию архива, у меня сложилось впечатление, что эти лишние 2 байта - id объекта, версия и т.п. - записываются внутри базовых классов, и от них никак не избавиться.
похоже придется писать полностью свою сериализацию
PM MAIL ICQ   Вверх
Lazin
Дата 2.7.2009, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



может реализовать свой архив используя инфраструктуру boost::serialization?
PM MAIL Skype GTalk   Вверх
GoldFinch
Дата 2.7.2009, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Lazin, код который мне нада убрать находится в
boost::archive::detail::basic_oarchive_impl::save_object()
это часть инфраструктуры boost::serialization

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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



GoldFinch, я никогда не использовал boost::serialization, но мне кажется, что boost::archive::detail::basic_oarchive_impl::save_object() куда-нибудь делегирует сохранение этого заголовка... иначе как можно было написать столько разных архивов?

Добавлено через 40 секунд
в документации должно быть что-нибудь на эту тему
PM MAIL Skype GTalk   Вверх
GoldFinch
Дата 2.7.2009, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Lazin, оно использует тот же архив для сохранения.
типа версия объекта int ver, и оно вызывает *this<<ver

а архив-то не знает что за int в него записали

Добавлено через 3 минуты и 59 секунд
в документации написано 
Код

The archive class is derived from:

template<class Archive>
detail::common_iarchive;

An instance of the this template handles all the "bookkeeping" associated with serialization.

что говорит о том, что так и задумано, что служебная информация пишется потрохами библиотеки
там есть методы позволяющие дописать еще и свою служебную информацию, но нет способа избавиться от родной
PM MAIL ICQ   Вверх
GoldFinch
Дата 2.7.2009, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



хм... а может я и неправ... 
в документации ничего нет, зато в каментах в коде много интересного, например
Код

class BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY()) basic_oarchive
{
...

    // overload these to bracket object attributes. Used to implement
    // xml archives
    virtual void vsave(const version_type t) =  0;
    virtual void vsave(const object_id_type t) =  0;
    virtual void vsave(const object_reference_type t) =  0;
    virtual void vsave(const class_id_type t) =  0;

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



****


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

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



да, действительно, написав такой класс, я избавился от этого префикса
Код

#include <boost/archive/binary_oarchive_impl.hpp>

// include template definitions for base classes used.  Otherwise
// you'll get link failure with undefined symbols
#include <boost/archive/impl/basic_binary_oprimitive.ipp>
#include <boost/archive/impl/basic_binary_oarchive.ipp>
#include <boost/archive/impl/archive_pointer_oserializer.ipp>

class raw_binary_oarchive :
    public boost::archive::binary_oarchive_impl<
        raw_binary_oarchive,
        std::ostream::char_type, 
        std::ostream::traits_type
    >
{
    typedef raw_binary_oarchive derived_t;
    typedef binary_oarchive_impl<
        raw_binary_oarchive, 
        std::ostream::char_type, 
        std::ostream::traits_type
    > base_t;

    friend class boost::archive::detail::interface_oarchive<derived_t>;
    friend class boost::archive::basic_binary_oarchive<derived_t>;
    friend class boost::archive::basic_binary_oprimitive<
        derived_t, 
        std::ostream::char_type, 
        std::ostream::traits_type
    >;
    friend class boost::archive::save_access;

    template<typename T>
    void save_override(T& t, BOOST_PFTO int)
    {
        base_t::save_override(t, 0);
    }

    void save_override(const boost::archive::version_type&, int) {} 
    void save_override(const boost::archive::class_id_type&, int) {}    
    void save_override(const boost::archive::class_id_reference_type&, int) {} 
    void save_override(const boost::archive::object_id_type&, int) {} 
    void save_override(const boost::archive::object_reference_type&, int) {} 
    void save_override(const boost::archive::tracking_type&, int) {} 

public:
    raw_binary_oarchive(std::ostream & os) :
        base_t(os, boost::archive::no_header)
    {}
    raw_binary_oarchive(std::streambuf & bsb) :
        base_t(bsb, boost::archive::no_header)
    {}
};

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


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

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