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


Автор: GoldFinch 1.7.2009, 19:10
как избавиться от какого-то префикса который пишется перед данными класса?

Код

#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"
а хотелось бы без этих двух нулевых байт, и чтоб конечно обратно читалось

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

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

скорее всего, эти байты кодируют тип объекта и нужны для того, что-бы "обратно читалось" smile 

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

Добавлено через 5 минут и 47 секунд
а где кстати про буст почитать можно, кроме boost.org, а то там информации почти нет

Автор: bsa 2.7.2009, 12:27

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

Автор: GoldFinch 2.7.2009, 13:37
bsa, я новичек в бусте %)

Автор: GoldFinch 2.7.2009, 18:55
немного потрассировав реализацию архива, у меня сложилось впечатление, что эти лишние 2 байта - id объекта, версия и т.п. - записываются внутри базовых классов, и от них никак не избавиться.
похоже придется писать полностью свою сериализацию

Автор: Lazin 2.7.2009, 20:39
может реализовать свой архив используя инфраструктуру boost::serialization?

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

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

Добавлено через 40 секунд
в документации должно быть что-нибудь на эту тему

Автор: GoldFinch 2.7.2009, 21:20
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.

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

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

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;

Автор: GoldFinch 3.7.2009, 11:20
да, действительно, написав такой класс, я избавился от этого префикса
Код

#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)
    {}
};

однако, для моей задачи надо еще переопределить сохранение строк и массивов, (у буста с префиксной длиной, мне надо без нее) и т.п. и т.д.
вобщем если написать то что надо мне используя буст, потребуется переопределить больше половины инфраструктуры буста, причем большая часть кода будет связана не с самим процессом сериализации, а борьбой с бустом.

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