如何在Boost序列化中创建序列化接口?

西蒙

我是新手,我想实现一个接口来强制用户实现序列化方法。此方法是模板,我不能定义为虚拟方法。

我希望用户只需要实现以下功能:

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

我尝试创建此接口:

  class interface_serializing
  {
  public:
    virtual ~interface_serializing(void)
    { }

    friend class boost::serialization::access;

    virtual void serialize(boost::archive::polymorphic_iarchive & ar, 
                   const unsigned int version) = 0;
    virtual void serialize(boost::archive::polymorphic_oarchive & ar, 
                   const unsigned int version)  = 0;
  };

但是它迫使用户实现这两种方法,这不是我想要的。

有什么办法可以做我想要的吗?

谢谢

没有内置的方法,但是您当然可以始终以适当的权衡取舍您想要的任何接口。

这是一个设想的解决方案,该解决方案使用自定义PolyArchive该自定义可以引用polymorphic_oarchivepolymorphic_iarchive

#include <boost/serialization/serialization.hpp>
#include <boost/archive/polymorphic_oarchive.hpp>
#include <boost/archive/polymorphic_iarchive.hpp>
#include <boost/archive/polymorphic_text_oarchive.hpp>
#include <boost/archive/polymorphic_text_iarchive.hpp>
#include <boost/variant.hpp>
#include <sstream>

using PolyArchive = boost::variant<
            boost::archive::polymorphic_oarchive&,
            boost::archive::polymorphic_iarchive&
        >;

struct /*abstract*/ ISerializable {
    virtual void serialize(PolyArchive, unsigned) = 0;
};

struct MyClass : ISerializable {
    std::string data_member = "Morgana"; // something to serialize

    // the one method we need to implement
    virtual void serialize(PolyArchive ar, unsigned) override;
};

现在,让我们用一点C ++ 14童话般的尘土来实现一下实现:

void MyClass::serialize(PolyArchive ar, unsigned) {
    boost::apply_visitor(make_visitor([=](auto& ar) { 
            ar & data_member;
        }), ar);
}

精明的读者会发现用户仍然提供模板方法,但是将其隐藏在实际上PolyArchive在编译时需要花费时间的虚拟方法中

完整演示

观看Live On Coliru上的打印:

Serialized: 22 serialization::archive 11 0 0 7 Morgana
Roundtripped: 22 serialization::archive 11 0 0 7 Morgana

代码:

#include <boost/serialization/serialization.hpp>
#include <boost/archive/polymorphic_oarchive.hpp>
#include <boost/archive/polymorphic_iarchive.hpp>
#include <boost/archive/polymorphic_text_oarchive.hpp>
#include <boost/archive/polymorphic_text_iarchive.hpp>
#include <boost/variant.hpp>
#include <sstream>

using PolyArchive = boost::variant<
            boost::archive::polymorphic_oarchive&,
            boost::archive::polymorphic_iarchive&
        >;

struct /*abstract*/ ISerializable {
    virtual void serialize(PolyArchive, unsigned) = 0;
};

struct MyClass : ISerializable {
    std::string data_member = "Morgana"; // something to serialize

    // the one method we need to implement
    virtual void serialize(PolyArchive ar, unsigned) override;
};

int main()
{
    std::stringstream ss;
    {
        // serialize:
        boost::archive::polymorphic_text_oarchive output(ss);

        MyClass object;
        output << object;
    }

    // Debug dump;
    std::cout << "Serialized: " << ss.str();

    {
        // read back:
        boost::archive::polymorphic_text_iarchive input(ss);

        MyClass cloned;
        input >> cloned;

        std::cout << "Roundtripped: ";
        boost::archive::polymorphic_text_oarchive pta(std::cout);
        pta << cloned;
    }
}

////////////////////////////////
// implementation:

namespace /*detail*/ {
    template <typename F> struct wrap_visitor : boost::static_visitor<> {

        wrap_visitor(F const& f) : f_(f) { }
        wrap_visitor(F&& f)      : f_(std::move(f)) { }

        template<typename... T> void operator()(T&&... t) const {
            f_(std::forward<T>(t)...);
        }

    private:
        F f_;
    };

    template <typename F> 
    wrap_visitor<F> make_visitor(F&& f) {
        return std::forward<F>(f);
    }
}

void MyClass::serialize(PolyArchive ar, unsigned) {

    boost::apply_visitor(make_visitor([=](auto& ar) { 
            ar & data_member;
        }), ar);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何序列化接口的默认属性?

来自分类Dev

如何(反)序列化接口的模拟?

来自分类Dev

接口的Jackson序列化

来自分类Dev

如何序列化boost :: rational

来自分类Dev

如何建立boost序列化库

来自分类Dev

如何在 Typescript 中序列化/反序列化复杂对象,例如反序列化对象与序列化对象的类型相同

来自分类Dev

如何使用Boost库序列化结构中的并集?

来自分类Dev

如何在C#中序列化/反序列化不可变列表类型

来自分类Dev

如何在序列化程序Django中序列化BigIntegerField,TextField

来自分类Dev

如何在go中序列化/反序列化地图

来自分类Dev

如何在Haskell中对通过网络发送的对象进行序列化/反序列化?

来自分类Dev

如何在Spring集成中忽略序列化器/反序列化器?

来自分类Dev

如何在Windows 8 Store App中序列化和反序列化observableCollection?

来自分类Dev

Play框架:如何在JSON中对枚举进行序列化/反序列化

来自分类Dev

如何在Kotlin中序列化/反序列化Custom对象的数组?

来自分类Dev

如何在TFS中反序列化和序列化构建过程参数

来自分类Dev

ServiceStack序列化字节[]。如何在JavaScript中反序列化?

来自分类Dev

如何在Azure Key Vault中序列化和反序列化PFX证书?

来自分类Dev

如何在Kotlinx序列化中序列化“任何”类型?

来自分类Dev

如何在Kotlinx序列化中序列化“任何”类型?

来自分类Dev

如何在TFS中反序列化和序列化构建过程参数

来自分类Dev

如何在php中反序列化jquery序列化数据?

来自分类Dev

使用XML序列化序列化接口列表

来自分类Dev

创建序列化模型

来自分类Dev

如何在django和djangorestframework中创建序列化程序和视图以创建子类别

来自分类Dev

如何使用接口序列化/反序列化列表

来自分类Dev

如何在PySpark中序列化LabeledPoint RDD?

来自分类Dev

如何在Rails中反序列化json

来自分类Dev

如何在kafka中定义多个序列化器?

Related 相关文章

  1. 1

    如何序列化接口的默认属性?

  2. 2

    如何(反)序列化接口的模拟?

  3. 3

    接口的Jackson序列化

  4. 4

    如何序列化boost :: rational

  5. 5

    如何建立boost序列化库

  6. 6

    如何在 Typescript 中序列化/反序列化复杂对象,例如反序列化对象与序列化对象的类型相同

  7. 7

    如何使用Boost库序列化结构中的并集?

  8. 8

    如何在C#中序列化/反序列化不可变列表类型

  9. 9

    如何在序列化程序Django中序列化BigIntegerField,TextField

  10. 10

    如何在go中序列化/反序列化地图

  11. 11

    如何在Haskell中对通过网络发送的对象进行序列化/反序列化?

  12. 12

    如何在Spring集成中忽略序列化器/反序列化器?

  13. 13

    如何在Windows 8 Store App中序列化和反序列化observableCollection?

  14. 14

    Play框架:如何在JSON中对枚举进行序列化/反序列化

  15. 15

    如何在Kotlin中序列化/反序列化Custom对象的数组?

  16. 16

    如何在TFS中反序列化和序列化构建过程参数

  17. 17

    ServiceStack序列化字节[]。如何在JavaScript中反序列化?

  18. 18

    如何在Azure Key Vault中序列化和反序列化PFX证书?

  19. 19

    如何在Kotlinx序列化中序列化“任何”类型?

  20. 20

    如何在Kotlinx序列化中序列化“任何”类型?

  21. 21

    如何在TFS中反序列化和序列化构建过程参数

  22. 22

    如何在php中反序列化jquery序列化数据?

  23. 23

    使用XML序列化序列化接口列表

  24. 24

    创建序列化模型

  25. 25

    如何在django和djangorestframework中创建序列化程序和视图以创建子类别

  26. 26

    如何使用接口序列化/反序列化列表

  27. 27

    如何在PySpark中序列化LabeledPoint RDD?

  28. 28

    如何在Rails中反序列化json

  29. 29

    如何在kafka中定义多个序列化器?

热门标签

归档