Boost Serialize - Сериализация данных настраиваемым способом - PullRequest
4 голосов
/ 14 октября 2010

Если я использую Boost Serialization для сериализации целого числа:

#include <boost/archive/text_oarchive.hpp> 
#include <iostream> 

int main() 
{ 
  boost::archive::text_oarchive oa(std::cout); 
  int i = 1; 
  oa << i; 
}

Результат будет следующим:
22 serialization::archive 5 1

Теперь мне интересно, если и как я могу изменить способ, определенные данные сериализуются. Данные не должны быть десериализованы, поэтому, если это больше невозможно, это не мешает делать это.

Допустим, приведенный выше код должен создать следующий вывод:
integer 11
(Добавлено слово integer, и значение будет увеличено на 10. Заголовок архива не будет интегрирован.)

Возможно ли это и как этого достичь? Может ли Boost Serialization позволить пользователю сделать это без изменения кодовой базы сериализации?

PS:
Пример кода выше скопирован из Highscore-Tutorial

1 Ответ

4 голосов
/ 25 февраля 2012

Вы можете написать свой собственный архив, примерно так:

#include <cstddef> // std::size_t
#include <string>
#include <typeid>

template <typename T>
std::string printName() {
  // Unmangle for your platform or just specialise for types you care about:
  return typeid(T).name();
}

//////////////////////////////////////////////////////////////
// class trivial_oarchive
class trivial_oarchive {
public:
    //////////////////////////////////////////////////////////
    // public interface used by programs that use the
    // serialization library
    typedef boost::mpl::bool_<true> is_saving; 
    typedef boost::mpl::bool_<false> is_loading;
    template<class T> register_type(){}
    template<class T> trivial_oarchive & operator<<(const T & t){
        return *this;
    }
    template<class T> trivial_oarchive & operator&(const T & t){
        // No idea why you'd want to add 10, but this does it:
        return *this << printName<T>() << " " << (t+10);
    }
    void save_binary(void *address, std::size_t count){};
};

(Адаптировано из документации )

...