c++ - boost 序列化: save_construct_data not called

标签 c++ boost boost-serialization

我正在使用 boost 来序列化没有默认构造函数的对象,但是我遇到了一个奇怪的问题:save_construct_data 没有被调用!

下面是重现此问题的示例程序:

main.cpp

#include <vector>
#include <iostream>
#include "Test.h"

#include <fstream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/serialization.hpp>

int main()
{
    using T = float;
    walid::Test<T> instance ( 2, {2.3f, -0.5f} ) ;

    std::ofstream ofs ( "data" );
    boost::archive::text_oarchive oa ( ofs );    
    oa << instance;   
}

测试.h

#ifndef __Test_HEADER__
#define __Test_HEADER__

#include <list>
#include <vector>
#include <iostream>
#include <initializer_list>

namespace walid
{ 
    template<typename T>
    class Test
    {
      public:
        std::vector<T> elements;
    int in_dim ;

    Test(int input_dim, std::initializer_list<T> elem)
    {
      in_dim = input_dim;
      elements = std::vector<T>(elem);
    }
    void start(){};
    void stop(){};
    };
}

#include "Test_serialization.inl"

#endif

最后是Test_serialization.inl

namespace boost {
namespace serialization {

    template<class Archive, class T>
    inline void serialize(Archive & ar, walid::Test<T>& t, const unsigned int version)
    {
      std::cout<<"serialize Test ..."<<std::endl;
    }

    template<class Archive, class T>
    inline void save_construct_data ( Archive & ar, const walid::Test<T>* t, const unsigned int version )
    {
        std::cout<<"call save_construct_data Test ..."<<std::endl;

    }

    template<class Archive, class T>
    inline void load_construct_data ( Archive & ar, walid::Test<T>* t, const unsigned int version )
    {
        std::cout<<"call load_construct_data Test ..."<<std::endl;
        ::new ( t ) walid::Test<T> ( 2, {2.3f, -0.5f} ) ;
    }
}
}

这段代码应该打印:

serialize Test ... 
call save_construct_data Test ...

但它只是打印serialize Test ...(不调用save_construct_data)

我错过了什么吗?

感谢您的帮助。

最佳答案

假设您正在构建 walid::Test<T> .

但是,如果你仔细观察,你会发现你实际上并没有构建任何东西。

根据设计,Boost Serialization 将序列化(反序列化为)左值。反序列化期间唯一需要构造的地方是序列化动态分配的对象时。

您可以通过将实例的存储更改为例如来说服自己shared_ptr :

Live On Coliru

#include <fstream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <boost/serialization/serialization.hpp>

#include <boost/shared_ptr.hpp>

int main()
{
    using T = float;
    using Test = walid::Test<T>;

    {
        boost::shared_ptr<Test> shared_instance(new Test(2, {2.3f, -0.5f}));

        std::ofstream ofs("data");
        boost::archive::text_oarchive oa(ofs);
        oa << shared_instance;
    }

    {
        boost::shared_ptr<Test> deserialized;

        std::ifstream ifs("data");
        boost::archive::text_iarchive ia(ifs);
        ia >> deserialized;
    }
}

打印

call save_construct_data Test ...
serialize Test ...
call load_construct_data Test ...
serialize Test ...

关于c++ - boost 序列化: save_construct_data not called,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31256298/

相关文章:

c++ - 传递大物体的最快方法

c++ - _mm256_shuffle_epi8 在这个生命游戏实现中有何意义?

c++ - boost::bind 内部拷贝/拷贝?

c++ - Windows 上的 boost.asio 错误代码是平台相关的?

c++ - 努力将 vector<char> 转换为 wstring

c++ - Boost 1.65.1 序列化到 vector 失败,出现 'Assertion initialized_ failed'

c++ - 无法使用 boost::serialization 和 shared_ptr 反序列化

c++ - 双星号语法 & 帮助调用成员函数

c++ - 如何逐步查看宏扩展?

c++ - 反序列化构造函数层次结构