【问题标题】:Able to serialize with boost but unable to deserialize std::shared_ptr能够用 boost 序列化但不能反序列化 std::shared_ptr
【发布时间】:2023-03-15 00:00:02
【问题描述】:

增强序列化

namespace boost { 

  namespace serialization {

    template <class Archive, class T>
    inline void save
        (Archive &archive, 
        const std::shared_ptr<T> subtree,  
        const unsigned int file_version)
    {
        // only the raw pointer has to be saved
        const T *const  subtree_x = subtree.get();

        archive << subtree_x;
    }

    template <class Archive, class T>
    inline void load
        (Archive &archive, 
        std::shared_ptr<T> subtree, 
        const unsigned int file_version)
    {

        T *p_subtree;

        archive >> p_subtree;

        #if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)
            subtree.release();
            subtree = std::shared_ptr< T >(p_subtree);
        #else
            subtree.reset(p_subtree);
        #endif
    }

    template <class Archive, class T>
    inline void serialize
        (Archive &archive, 
        std::shared_ptr<T> subtree,  // no const or else get compile-time error
        const unsigned int file_version)
    {
        boost::serialization::split_free(archive, subtree, file_version);
    }

  } // namespace serialization
} // namespace boost

树类

class Tree{

private:

class TreeNode{

public:


    std::shared_ptr<TreeNode> node_factory(const T &new_key, const long &new_index)
    {
        return std::shared_ptr<TreeNode>(new TreeNode(new_key, new_index)); 
    }

    friend class Tree;

private:

    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive &archive, const unsigned int /* file_version */){
        archive & key;
        archive & index;
        archive & left;
        archive & right;
    }

    T key;
    long index;

    std::shared_ptr<TreeNode> left;
    std::shared_ptr<TreeNode> right;

};  // End Tree Node Class Definition

friend class boost::serialization::access;
template <class Archive>
void serialize(Archive &archive, const unsigned int version){
    archive & root;
}
 };

作家

bool save(std::shared_ptr<Tree> &tree, const std::string &search_tree_file_name)
{
    // create and open a binary archive for output
    std::ofstream writer(search_tree_file_name, std::ofstream::out | std::ofstream::binary);

    if(writer){
        boost::archive::binary_oarchive serial_writer(writer);
        //set_flags(0, true);
        // write class instance to archive
        serial_writer << *tree;
        // archive and stream closed when destructors are called

    }else if(writer.fail()){
        writer.clear();
    }
    return true;
}

读者

enter code here bool load(std::shared_ptr<Tree> &tree, const std::string &search_tree_file_name)
{
    // create and open a binary archive for output
    std::ifstream reader(search_tree_file_name, std::ifstream::in | std::ifstream::binary);

    if(reader){
        boost::archive::binary_iarchive serial_reader(reader);
        // read class state from archive
        serial_reader >> *tree;
        // archive and stream closed when destructors are called

    }else if(reader.fail()){
        reader.clear();
    }

    return true;
} 

我已写入文件并验证成功序列化到文件,但未能反序列化到可用对象。

无论我是用文本还是二进制编写,我都可以验证序列化输出是否正确,但由于某种原因,序列化输出不会反序列化,并且在加载时我留下了一个空对象。

【问题讨论】:

  • 我建议不要为所有共享指针定义加载/保存,而是为std::shared_ptr&lt;TreeNode&gt; 定义。
  • 你遇到了什么错误?
  • @n.m.没有得到错误。只是看不到反序列化的数据。 serial_reader &gt;&gt; *tree; 完成后,树与作为参数传入的相同。
  • @DaveS 我也在序列化树root,因此我将树序列化为std::shared_ptr。您是否建议不要序列化 ​​root 并仅序列化 TreeNode?​​span>
  • 这不会编译。请贴出真实代码。

标签: c++ serialization boost


【解决方案1】:

【讨论】:

  • 我阅读了您的链接并对加载、保存和序列化声明进行了更改,但改为执行以下操作:删除了命名空间提升和序列化声明,现在使用 boost::shared_ptr 而不是 std::shared_ptr。序列化问题现已解决。
【解决方案2】:

虽然@Arun 提供了对使用std::shared_ptr 有用的优秀文档参考,但我选择使用boost::shared_ptr 和 boost::serialization,它解决了我的反序列化问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    相关资源
    最近更新 更多