c++ - 通过指向派生类的基指针 boost 序列化

标签 c++ serialization boost

<分区>

Possible Duplicate:
Boost Serialization using polymorphic archives

我正在尝试使用指向派生类的基指针来序列化我的类,但这只会序列化基类。

我刚刚读了http://www.boost.org/doc/libs/1_32_0/libs/serialization/doc/special.html#registration , 但导出宏和注册函数似乎都没有改变任何东西。

考虑以下非常基本的类层次结构:

#include <iostream>
#include <fstream>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>

class A
{
private:
  friend class boost::serialization::access;
  template <typename Archive>
  void serialize(Archive& ar, const unsigned int version)
  { 
    std::cout << "A!\n";
  }
};

class B : public A
{
private:
  friend class boost::serialization::access;
  template <typename Archive>
  void serialize(Archive& ar, const unsigned int version)
  {
    ar & boost::serialization::base_object<A>(*this);
    std::cout << "B!\n";
  }
};

int main()
{
  std::ofstream of("mybin.bin");
  boost::archive::binary_oarchive oa(of);

  A* b = new B();
  oa << b;

  delete b;

  return 0;
}

输出将是:

A!

显然,我正在寻找的输出是 A!乙!有什么办法可以实现吗?

编辑:好的,在查看评论中的相关条目后,这就是正在发生的事情。

有 3 件事要改变:

  1. A 类应该有一个虚函数,这样它才被认为是多态的
  2. 需要导出派生类。 BOOST_CLASS_EXPORT(B)
  3. oa << b 而不是 oa << *b

它与标准的 binary_oarchive 以及 polymorphic_binary_oarchive 一起工作。

EDIT2:当我说 b.cpp(.h) 和 main.cpp 时,BOOST_CLASS_EXPORT 会导致重复的符号:

重复符号 boost::archive::detail::extra_detail::init_guid::g

最佳答案

我必须承认我不熟悉这个boost包,但我复制并编译了代码,结果与提到的 OP 相同

意识到我们正在使用多态性,我添加了一个 public: virtual ~A(){};class A .另外,oa.register_type<B>();添加到 main根据文档,输出变为:

A!
B!

根据规范,一个类是一个polymorphic class仅当 declares or inherits a virtual function .对于非多态类,多态性可能不起作用。

编辑:

BOOST_CLASS_EXPORT(B);B.cpp而不是 B.h似乎解决了这个重新定义的问题。

编辑:

查看BOOST_CLASS_EXPORT(B)的展开结果(重新格式化):

namespace boost {
    namespace serialization {
        template<> struct guid_defined<B> : boost::mpl::true_ {};
        template<> inline const char * guid<B>(){ return "B"; }
    }
}
namespace boost {
    namespace archive {
        namespace detail {
            namespace { // NOTE
                template<> struct init_guid< B > {
                    static guid_initializer< B > const & g;
                };
                guid_initializer< B > const & init_guid< B >::g = ::boost::serialization::singleton< guid_initializer< B > >::get_mutable_instance().export_guid();
            }
        }
    }
}

对于标记为 NOTE 的行: 对于boost 1.42,使用了匿名命名空间,如果将其放入多个cpp文件或放入头文件中,这将没有问题(在带有g++的ubuntu中测试,使用Ubuntu附带的boost包)。然而,在 boost 1.48 中,namespace extra_detail被使用,放入多个cpp文件时会出现问题(在windows下用VS2010测试,使用从主页下载的boost)。

关于c++ - 通过指向派生类的基指针 boost 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8351299/

相关文章:

c++ - 如何通过指向基类的指针序列化派生类? Derived::serialize 未调用

c++ - 关于多线程客户端的 BOOST 教程?

java - 如何在不实际序列化对象的情况下估计 Java 中对象的序列化大小?

c# - 可移植类库对象序列化

c++ - 将 boost 与 numerical recipes 3 代码集成

c++ - 为什么在遗留 strcpy() 中没有健全性检查

c++ - 在 C++ 中存储派生类的实例

c++ - 从 Win16 移植到 Win32 - ASM 代码块混淆

c++ - 类内的 stable_sort

使用 DatagramChannels 和序列化时的 Java NIO BufferUnderflowException