Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.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++ Boost动态序列化所有派生类型_C++_Serialization_Boost - Fatal编程技术网

C++ Boost动态序列化所有派生类型

C++ Boost动态序列化所有派生类型,c++,serialization,boost,C++,Serialization,Boost,对于虚拟基类的所有派生类型,是否绝对需要调用BOOST\u CLASS\u EXPORT()或register\u type()?有没有办法只指定基类 下面是一些示例代码(我使用的是boost 1.59): #包括 #包括 #包括 #包括 #包括 #包括 #包括 //#包括 #包括 #包括 班级家长{ 公众: int test_val=1234234; int p(){return 13294;} 虚空测试()=0; int get_test_val(){ 标准::cout是,这是必需的 您已经

对于虚拟基类的所有派生类型,是否绝对需要调用
BOOST\u CLASS\u EXPORT()
register\u type()
?有没有办法只指定基类

下面是一些示例代码(我使用的是boost 1.59):

#包括
#包括
#包括
#包括
#包括
#包括
#包括
//#包括
#包括
#包括
班级家长{
公众:
int test_val=1234234;
int p(){return 13294;}
虚空测试()=0;
int get_test_val(){
标准::cout是,这是必需的

您已经看到了机制。宏只不过是一种自动化宏扩展时已知的存档类型的
register\u type
舞蹈的方法

在本例中,您可以在
Test
serialize方法中列出类型,这将是“及时的”——前提是在此之前您没有反序列化
Parent
多态实例

这也适用于:

class Test {
public:
    int t_ = 0;
    ParentRef parent_;

    Test(int t = 0, ParentRef parent = std::make_shared<RefMem1>()) : t_(t), parent_(parent) {}

    template <class Archive> void serialize(Archive &ar, unsigned) {
        ar.template register_type<RefMem1>();
        ar.template register_type<RefMem2>();
        ar & t_ & parent_; 
    }
};
类测试{
公众:
int t=0;
ParentRef parent_u2;;
测试(int t=0,ParentRef parent=std::make_shared()):t_u(t),parent_u(parent){
模板无效序列化(存档(&R),未签名){
ar.template寄存器类型();
ar.template寄存器类型();
应收账款和应付账款及母公司;
}
};
如果更改存档顺序:

    oa << test << the_instance;
    // ...
    ia >> cloned >> the_cloned_instance;
oa cloned>>已克隆的\u实例;

查看

两个问题:1)我必须在我的库中的任何地方注册/导出,无论我在哪里通过它的基序列化派生类?没有人,已经完成了?2)你认为应该使用哪一个?宏,即BOOST_class_export()或register_type()?我读了register_type()允许一种动态导出,您可以在其中选择特定的派生类,但如果您首先使用基类,我看不出这有什么意义。我发现这()可能是对#1的回答,但我无法理解不在标题中包含导出的原因。a.hpp中的“包括BOOST_class_导出”一句“标头本身与其他序列化特性一样,在调用BOOST_CLASS_导出之前,将很难或不可能遵循上述关于包含存档标头的规则。”这听起来似乎是可能的,但不推荐使用。#1没有捷径(C++中没有反射,所以根本不可能知道您可以显式地注册什么类型的反序列化。有两种机制:<代码> RealStyType < /Cuff>更繁琐,但给予更多的控制。<代码>导出< /Cord>宏更方便。”2参见;您可以将宏分割为“谢谢”。Als。o在coliru上的代码中,第86行和第87行有register_type,我测试了它们,但它们不是必需的,并且与您在回答中提到的不同,对吗?这可能会让人困惑。
    oa << test << the_instance;
    // ...
    ia >> cloned >> the_cloned_instance;