В моем приложении есть класс "MyClass".Его объекты создаются из Boost Object_pool.
Мне нужно сериализовать / де сериализовать этот объект класса с помощью Boost Binary Serialization.
Для сериализации -
Я беру указатель из пула, выполняю некоторые операции и сериализую его через двоичную сериализацию Boost.Пока все хорошо.
Для десериализации -
Я выбираю этот сериализованный буфер и десериализуем его с помощью двоичной сериализации Boost.Десериализация происходит успешно, но во время процесса новая память выделяется механизмом быстрой сериализации, который не создан из пула объектов.
Если я выделяю указатель из пула перед десериализацией, десериализация выделяетпамять снова в куче, и дорожка памяти из пула теряется.Следовательно, я не смогу повторно использовать эту память, выделенную механизмом ускоренной сериализации, поскольку она не может быть возвращена пулу объектов, поскольку она не была создана из пула.
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/serialization/binary_object.hpp>
#include <boost/pool/object_pool.hpp>
#include <iostream>
#include <sstream>
#include <string>
class MyClass
{
public :
friend class boost::serialization::access;
MyClass():data(9)
{
std::cout << std::endl << "MyClass()" << std::endl ;
}
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & data;
}
~MyClass()
{
}
private :
int data ;
};
int main()
{
try
{
boost::object_pool<MyClass> pool ;
// Get object from the Pool.
MyClass *b = pool.construct();
// Serialization
std::stringbuf strbuf;
boost::archive::binary_oarchive oa( strbuf ) ;
oa << b ;
// Deserilaiztion
//MyClass *a = pool.construct() ;
MyClass *a ;
std::stringbuf strbufr(strbuf.str()) ;
boost::archive::binary_iarchive ia( strbufr ) ;
// This calls the constructor and allocates memory for the pointer.
// If we allocates this from the pool, new memory is still allocated
// and we loose track of the pointer fetched from the pool.
ia >> a;
}
catch ( boost::archive::archive_exception &e )
{
std::cout << std::endl << e.what() << std::endl ;
}
}
Что мне нужно -
Я хочу десериализовать буфер в указатель, выделенный из пула.
Прошел документ Boost для сериализации и нашел концепциюОболочки бинарных объектов, однако это приводит к ошибкам компиляции.
Основная функция: -
int main()
{
try
{
boost::object_pool<MyClass> pool ;
MyClass *b = pool.construct();
std::stringbuf strbuf;
boost::archive::binary_oarchive oa( strbuf ) ;
oa << boost::serialization::binary_object(b, sizeof(MyClass) ) ;
MyClass *a = pool.construct() ;
std::stringbuf strbufr(strbuf.str()) ;
boost::archive::binary_iarchive ia( strbufr ) ;
ia >> boost::serialization::binary_object(b, sizeof(MyClass) );
}
catch ( boost::archive::archive_exception &e )
{
std::cout << std::endl << e.what() << std::endl ;
}
}
Это дает следующие ошибки компиляции: -
serializationCpy.cpp: In function ‘int main()’:
serializationCpy.cpp:56:8: error: no match for ‘operator>>’ (operand types are ‘boost::archive::binary_iarchive’ and ‘boost::serialization::binary_object’)
ia >> boost::serialization::binary_object(b, sizeof(MyClass) );
^
serializationCpy.cpp:56:8: note: candidate is:
In file included from /home/boost_root/include/boost/archive/detail/common_iarchive.hpp:23:0,
from /home/boost_root/include/boost/archive/basic_binary_iarchive.hpp:30,
from /home/boost_root/include/boost/archive/binary_iarchive_impl.hpp:21,
from /home/boost_root/include/boost/archive/binary_iarchive.hpp:20,
from serializationCpy.cpp:1:
/home/boost_root/include/boost/archive/detail/interface_iarchive.hpp:67:15: note: Archive& boost::archive::detail::interface_iarchive<Archive>::operator>>(T&) [with T = boost::serialization::binary_object; Archive = boost::archive::binary_iarchive]
Archive & operator>>(T & t){
^
/home/boost_root/include/boost/archive/detail/interface_iarchive.hpp:67:15: note: no known conversion for argument 1 from ‘boost::serialization::binary_object’ to ‘boost::serialization::binary_object&’
Является ли этоправильный способ использования сериализации с пулом объектов?
Помощь будет высоко оценена.