当前位置: 首页 > 知识库问答 >
问题:

能够用boost序列化,但无法反序列化std::shared_ptr

太叔永新
2023-03-14

推进序列化

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;
} 

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

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

共有2个答案

富凯旋
2023-03-14

虽然@Arun为利用std::shared_ptr提供了非常有用的留档引用,但我选择使用提升::shared_ptr与提升::序列化,它已经治愈了我的反序列化问题。

赫连彬炳
2023-03-14

看看这些链接,可能会给你提供一些线索。http://www.boost.org/doc/libs/1_49_0/libs/serialization/doc/shared_ptr.html

 类似资料:
  • 问题内容: 我是C ++的新手。使用序列化和反序列化类型数据的最简单方法是什么。我发现了一些使用示例,但它们对我来说是晦涩的。 问题答案: 请注意,将键解释为路径,例如,将对“ ab” =“ z”放置将创建{“ a”:{“ b”:“ z”}} JSON,而不是{“ ab”:“ z”} 。否则,使用是微不足道的。这是一个小例子。

  • 我正在读取xml文件并将其存储到boost::property_tree::ptree pt(object)中。 我试图序列化这个ptree对象使用方法定义在ptree_serialization.hpp 当我使用上述代码时,我得到的错误是:; 如果我做错了什么,你能告诉我吗。请告诉我是否可以序列化xml解析的属性ptree对象。

  • 问题内容: 我试图序列化和反序列化内部对象的数组列表: HairList对象也是一个可序列化的对象。 此代码执行返回以下错误: 排队 我不知道我在做什么错。你能给个小费吗? 更新: 解决: 仅使用HairBirt的本机数组而不是ArrayList即可工作: 代替 感谢大家的帮助。 问题答案: 不要使用-而是使用二进制数据并对它进行base64编码,以将其转换为字符串而不会丢失信息。 我强烈怀疑这是

  • 我有一门课是这样的: 但是当我试图序列化它时,我收到一个错误,上面写着“试图序列化java.lang.class:java.lang.字符串。忘记注册一个类型适配器了吗?”。所以我创建了这个适配器: } 并登记如下: 但我还是犯了同样的错误<我做错了什么 适配器的实现看起来正常吗?

  • 问题内容: 作为一个小项目,我一直在尝试做一个小事,它可以读取序列化的lambda(从本地或从FTP)并调用它们的运行函数作为测试的一部分,以测试Windows中的文件关联(即打开某些文件类型)使用特定程序打开它们),但不管如何,无论如何,它似乎从未正确地反序列化。 lambda被这样声明 并使用由ObjectOutputStream包装的[n可选] BufferedOutputStream包装的

  • 问题内容: 在hibernate状态下执行条件查询时,出现以下异常: 可能是什么问题呢? PS:虽然可能不相关,但我的hibernate版本是hibernate-4.0.1 final。 问题答案: 问题在于被引用的实体对实体有另一个引用,并且该关系未由任何-like注释进行注释。