多个库并增强序列化
Multiple libraries and boost serialization
我在以下情况下有问题:我有一堂课,假设在动态库中的基础。可以序列化基础。我有另一个类,派生在另一个可以序列化的动态库中。当我将存储在与libbase和libderived链接的程序中的基本*变量中的派生的实例序列化时,我无法使Boost See vered vered。即。
生成的文件具有以下内容
22 serialization::archive 10 0 1 0
0 10 Base Class
我知道,衍生的序列化函数永远不会被调用
我缺少什么?
base.h
#ifndef BASE_H
#define BASE_H
#include <string>
#include <boost/serialization/export.hpp>
#include <boost/serialization/access.hpp>
using namespace std;
class Base {
public:
Base();
private:
string _str;
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version);
};
BOOST_CLASS_EXPORT_KEY(Base)
#endif
base.cpp
#include "base.h"
Base::Base() : _str("Base Class") {}
template<class Archive>
void Base::serialize(Archive & ar, const unsigned int version){
ar & _str;
}
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
template void Base::serialize(boost::archive::text_oarchive & ar, const unsigned int version);
template void Base::serialize(boost::archive::text_iarchive & ar, const unsigned int version);
BOOST_CLASS_EXPORT_IMPLEMENT(Base)
衍生.h
#ifndef DERIVED_H
#define DERIVED_H
#include <string>
#include "base.h"
#include <boost/serialization/export.hpp>
#include <boost/serialization/access.hpp>
using namespace std;
class Derived : public Base {
public:
Derived();
private:
string _str;
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version);
};
BOOST_CLASS_EXPORT_KEY(Derived)
#endif
dedived.cpp
#include "derived.h"
#include <boost/serialization/base_object.hpp>
Derived::Derived() : Base(), _str("derived") { }
template<class Archive>
void Derived::serialize(Archive & ar, const unsigned int version){
ar & boost::serialization::base_object<Base>(*this);
ar & _str;
}
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
template void Derived::serialize(boost::archive::text_oarchive & ar, const unsigned int version);
template void Derived::serialize(boost::archive::text_iarchive & ar, const unsigned int version);
BOOST_SERIALIZATION_MWERKS_BASE_AND_DERIVED(Base, Derived)
BOOST_CLASS_EXPORT_IMPLEMENT(Derived)
main.cpp
#include "derived.h"
#include <iostream>
#include <fstream>
#include <boost/archive/text_oarchive.hpp>
int main()
{
Base * b = new Derived();
std::ofstream ofs("test.txt");
boost::archive::text_oarchive oa(ofs);
oa << b;
ofs.close();
}
compile.sh
g++ -g -c -Wall -fPIC base.cpp -o base.o
g++ -shared -Wl,-soname,libbase.so -o libbase.so base.o -lc
g++ -g -c -Wall -fPIC derived.cpp -o derived.o
g++ -shared -Wl,-soname,libderived.so -o libderived.so derived.o -lc
g++ main.cpp -lbase -lderived -o main -L . -lboost_serialization
您的类型需要支持RTTI。
为了使它正确,它需要具有VTable。制作虚拟的最常见成员是破坏者:
virtual ~Base() = default;
现在导致
22 serialization::archive 10 1 1 0
0 1 0
1 10 Base Class 13 derived_value
如果您负担不起RTTI的负担,则图书馆提供了一种替代方案:http://www.boost.org/doc/libs/1_55_0/libs/libs/serialization/doc/doc/draits.html#typeinfo
相关文章:
- 增强基于 XML class_id的反序列化
- 增强序列化,按基类型加载存档类会产生错误的数据
- 增强多重继承的序列化
- 来自抽象基础的次要化因增强序列化而失败
- 如何更改或删除标签,以增强序列化
- 崩溃:分段故障:增强序列化加载 - 用null调用构造函数
- 在同一程序中使用谷物并增强序列化
- 使用指针增强序列化
- 如何增强序列化STL容器
- 增强序列化多态性类
- 增强动态阵列的序列化
- 增强多边形序列化:环
- 多个库并增强序列化
- 增强序列化-启用对象跟踪
- 在取消引用的基类指针上增强序列化
- c++增强序列化如何防止不正确的文件崩溃
- 跟踪何时为增强序列化添加数据成员
- 链接到增强序列化时出错
- 处理可能的空指针的类的增强序列化
- 增强序列化-在反序列化损坏数据时不再出现archive_exception