Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;从Boost对象池构造的指针的Boost二进制序列化_C++_Pointers_Serialization_Boost_Memory Pool - Fatal编程技术网

C++ C++;从Boost对象池构造的指针的Boost二进制序列化

C++ C++;从Boost对象池构造的指针的Boost二进制序列化,c++,pointers,serialization,boost,memory-pool,C++,Pointers,Serialization,Boost,Memory Pool,我的应用程序有一个类“MyClass”。它的对象是从Boost对象池构建的 我需要通过Boost二进制序列化来序列化/反序列化这个类对象 对于序列化- 我从池中获取一个指针,执行一些操作,并通过Boost二进制序列化将其序列化。到目前为止一切都很好 对于反序列化- 我获取序列化的缓冲区,并使用Boost二进制序列化对其进行反序列化。反序列化成功进行,但在此过程中,新内存由Boost序列化机制分配,该机制不是从对象池构造的。 如果我在反序列化之前从池中分配指针,反序列化将再次在堆上分配内存,并且池

我的应用程序有一个类“MyClass”。它的对象是从Boost对象池构建的

我需要通过Boost二进制序列化来序列化/反序列化这个类对象

对于序列化-

我从池中获取一个指针,执行一些操作,并通过Boost二进制序列化将其序列化。到目前为止一切都很好

对于反序列化-

我获取序列化的缓冲区,并使用Boost二进制序列化对其进行反序列化。反序列化成功进行,但在此过程中,新内存由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 ;
 }

}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
类MyClass
{
公众:
好友类boost::serialization::access;
MyClass():数据(9)
{
标准::cout>(T&T){
^
/home/boost\u root/include/boost/archive/detail/interface\u iarchive.hpp:67:15:注意:参数1没有从“boost::serialization::binary\u object”到“boost::serialization::binary\u object&”的已知转换
对对象池使用序列化是否正确?
非常感谢您的帮助。

我建议您制作一个或具有自定义序列化逻辑的自定义智能指针

binary\u object
方法将起作用,但仅适用于POD数据类型。

来源于answer,我认为应该是这样

ia >> boost::serialization::make_binary_object(a, sizeof(MyClass));

而不是
ia>>boost::serialization::binary_对象(b,sizeof(MyClass));

修正其他打字错误,它将变成:

#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>

class MyClass
{
public:
    friend class boost::serialization::access;
    MyClass(int data) :data(data)
    {
        std::cout << "\nMyClass(" << data << ")\n";
    }

    MyClass()
    {
        std::cout << "\nMyClass()\n";
    }

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

    void printData()
    {
        std::cout << "Data = " << data << "\n";
    }
private:
    int data;
};

int main()
{
    try
    {
        boost::object_pool<MyClass> pool;

        MyClass *b = pool.construct(6);

        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::make_binary_object(a, sizeof(MyClass));

        a->printData();
    }
    catch (boost::archive::archive_exception &e)
    {
        std::cout << std::endl << e.what() << std::endl;
    }
    return 0;
}

我的类始终只包含原始数据类型。因此,如果二进制对象技术可以工作,为什么它不编译。代码中可能有错误。你能给我一些建议吗?我同意。等我有时间的时候,我会回来的。嘿@sehe我正试图在同一个程序中领先一步,指针我试图序列化和反序列化的现在出现在std::map MyMap中。同样,MyMap的序列化作为一个整体运行良好,但在反序列化过程中从池中获取这些指针对我来说仍然是一个挑战。我刚刚用boost vc141和1.65.1编译了您的代码,没有任何编译器错误。第一个版本是getting compiled,这是导致编译错误的第二个主要函数。我正在使用gcc 4.8.5和boost 1.65.1,它给了我编译错误。我知道make_binary_object返回const binary_object,现在可以使用它的引用。程序正在编译,一切都按要求运行。但是,
ia&boost::serialization::binary_对象(b,sizeof(MyClass));
不起作用。@Iranjeetgh“不起作用”是什么意思。它该怎么办?顺便问一下,可以用
b
代替
a
(你刚才在它前面创建的对象)输入错误?为什么没有使用
strbufr
b
而不是
a
是输入错误。是的,
strbufr
不需要使用。和
ia&boost::serialization::binary_对象(a,sizeof(MyClass))
导致编译错误。解决方法是使用
生成二进制对象
而不是
二进制对象
,因为它返回的常量对象的引用可以被boost序列化类获取和使用。@IranjeetSingh我扩展了我的答案。你喜欢吗?嘿@jhbonaris。我正试图在同一个pro中领先一步gram,我尝试序列化和反序列化的指针现在出现在
std::map MyMap
中。同样,MyMap的序列化作为一个整体工作正常,但是在反序列化期间从池中获取这些指针对我来说仍然是一个挑战。
ia >> boost::serialization::make_binary_object(a, sizeof(MyClass));
ia & boost::serialization::make_binary_object(a, sizeof(MyClass));
#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>

class MyClass
{
public:
    friend class boost::serialization::access;
    MyClass(int data) :data(data)
    {
        std::cout << "\nMyClass(" << data << ")\n";
    }

    MyClass()
    {
        std::cout << "\nMyClass()\n";
    }

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

    void printData()
    {
        std::cout << "Data = " << data << "\n";
    }
private:
    int data;
};

int main()
{
    try
    {
        boost::object_pool<MyClass> pool;

        MyClass *b = pool.construct(6);

        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::make_binary_object(a, sizeof(MyClass));

        a->printData();
    }
    catch (boost::archive::archive_exception &e)
    {
        std::cout << std::endl << e.what() << std::endl;
    }
    return 0;
}
MyClass(6)

MyClass()
Data = 6