c – 使用多态存档的Boost序列化

前端之家收集整理的这篇文章主要介绍了c – 使用多态存档的Boost序列化前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用一个客户端 – 服务器应用程序,它使用boost :: serialization库来满足它的序列化需求.

我需要对似乎不起作用的多态对象进行序列化和反序列化.文档确实表示它是受支持的,但没有相关示例显示我在这里做的工作.所以,我不太确定.我的问题是可以使用boost来序列化/反序列化多态对象吗?如果是,我在这里做错什么?

谢谢!

码:

  1. using namespace std;
  2.  
  3. class base {
  4. public:
  5. int data1;
  6.  
  7. friend class boost::serialization::access;
  8.  
  9. void serialize(boost::archive::polymorphic_iarchive & ar,const unsigned int file_version) {
  10. ar & data1;
  11. }
  12.  
  13. void serialize(boost::archive::polymorphic_oarchive & ar,const unsigned int file_version){
  14. ar & data1;
  15. }
  16.  
  17. public:
  18. base() {};
  19. base(int _d) : data1(_d) {}
  20. virtual void foo() const {std::cout << "base" << std::endl;}
  21. };
  22.  
  23. class derived : public base {
  24. public:
  25. int data2;
  26.  
  27. friend class boost::serialization::access;
  28.  
  29. void serialize(boost::archive::polymorphic_iarchive & ar,const unsigned int file_version) {
  30. ar & boost::serialization::base_object<base>(*this) & data2;
  31. }
  32.  
  33. void serialize(boost::archive::polymorphic_oarchive & ar,const unsigned int file_version){
  34. ar & boost::serialization::base_object<base>(*this) & data2;
  35. }
  36.  
  37. public:
  38. derived() {};
  39. derived(int _b,int _d) : base(_b),data2(_d) {}
  40. virtual void foo() const {std::cout << "derived" << std::endl;}
  41. };
  42.  
  43. int main(int argc,char *argv[]) {
  44. // client
  45. const base *b1 = new derived(1,2);
  46.  
  47. std::ostringstream oss;
  48. boost::archive::polymorphic_text_oarchive oa(oss);
  49. oa << *b1;
  50.  
  51. // server
  52. base *b2 = new derived(3,4);
  53.  
  54. std::istringstream iss(oss.str());
  55. boost::archive::polymorphic_text_iarchive ia(iss);
  56. ia >> *b2;
  57.  
  58. // prints 1,ok
  59. cout << b2->data1 << endl;
  60.  
  61. // prints 4,why wasn't the derived class data written?
  62. cout << (dynamic_cast<derived*>(b2))->data2 << endl;
  63.  
  64. return 0;
  65. }

解决方法

找到一个决议.我不得不使用语句导出派生类:
  1. BOOST_CLASS_EXPORT(derived);

发布一些适用于某些更正的内容.

  1. using namespace std;
  2.  
  3. class base {
  4. public:
  5. int data1;
  6.  
  7. friend class boost::serialization::access;
  8.  
  9. template<typename Archive>
  10. void serialize(Archive & ar,const unsigned int file_version) {
  11. ar & data1;
  12. }
  13.  
  14. public:
  15. base() {};
  16. base(int _d) : data1(_d) {}
  17. virtual void foo() const {std::cout << "base" << std::endl;}
  18. };
  19.  
  20. class derived : public base {
  21. public:
  22. int data2;
  23.  
  24. friend class boost::serialization::access;
  25.  
  26. template<typename Archive>
  27. void serialize(Archive & ar,const unsigned int file_version) {
  28. ar & boost::serialization::base_object<base>(*this);
  29. ar & data2;
  30. }
  31.  
  32. public:
  33. derived() {};
  34. derived(int _b,data2(_d) {}
  35. virtual void foo() const {std::cout << "derived" << std::endl;}
  36. };
  37.  
  38. BOOST_CLASS_EXPORT(derived);
  39.  
  40. int main(int argc,char *argv[]) {
  41. // client
  42. // Assign to base type
  43. std::unique_ptr<const base> b1(new derived(1,2));
  44.  
  45. std::ostringstream oss;
  46. boost::archive::text_oarchive oa(oss);
  47. oa & b1.get();
  48.  
  49. // server
  50. // Retrieve derived type from base
  51. std::unique_ptr<base> b2;
  52.  
  53. std::istringstream iss(oss.str());
  54. boost::archive::text_iarchive ia(iss);
  55. {
  56. base *temp;
  57. ia & temp;
  58. b2.reset(temp);
  59. }
  60. cout << b2->data1 << endl;
  61. cout << (dynamic_cast<derived*>(b2.get()))->data2 << endl;
  62.  
  63. return 0;
  64. }

猜你在找的C&C++相关文章