多个库并增强序列化

Multiple libraries and boost serialization

本文关键字:增强 序列化      更新时间:2023-10-16

我在以下情况下有问题:我有一堂课,假设在动态库中的基础。可以序列化基础。我有另一个类,派生在另一个可以序列化的动态库中。当我将存储在与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