簡體   English   中英

Boost :: smart_ptr的C ++非侵入式Boost序列化

[英]C++ non intrusive boost serialization of a boost::smart_ptr

我正在嘗試對無法使用boost :: serialization進行修改的自定義類進行序列化 ,並且需要將邏輯/計算代碼與序列化部分分開。 它有一些我必須序列化的保護和私有字段,其中一些是其他類的boost :: shared_ptr

就像是:

// computational classes
class A
{
public:
   A(int a) : m_val(a) {}
private:
   int m_val
};

class B
{
public:
   B(a) : m_ptr(new A(a)) {}
private:
   boost::shared_ptr< A > m_ptr;
};

我發現一種簡單的解決方法可以序列化類A,僅在其定義中添加“朋友類”:

class A_ser;
class A
{
   friend class A_ser;
   //...
};

並添加一個代理類以對其進行序列化,該類具有對A類字段的引用:

class A_ser
{
public:
   A_ser(A & a) : m_val(A.m_val) {}
   template< class Archive >
   void serialize(Archive & ar, const unsigned int version)
   {
      ar & m_val;
   }
private:
   int & m_val;
};

namespace boost {
namespace serialization {
template< class Archive >
void serialize(Archive & ar, A & a, const unsigned int version)
{
   A_ser sa(a);
   ar & sa;
}
} // namespace serialization
} // namespace boost

因此,當在A上調用序列化方法時,將使用A_ser的方法。

當我嘗試對類B執行相同操作時,會出現問題,因為在其反序列化過程中,它嘗試調用未定義的構造函數A():

boost / serialization / access.hpp:132:錯誤:沒有匹配的函數可以調用'A :: A()'

如果我嘗試將默認參數放入A的構造函數中,它只會初始化一個全新的空類。

哦,我使用的是Boost 1.53.0。

提前謝謝了。

編輯:解決方案(它是如此簡單..)

只需修改* _ser引用

class A_ser
{
public:
   A_ser(A & a) : m_a(A) {}
   template< class Archive >
   void serialize(Archive & ar, const unsigned int version)
   {
      ar & m_a.m_val;
   }
private:
   A & m_a;
};

並添加

template< class Archive >
void load_construct_data(Archive & /*ar*/, A * t, unsigned /*v*/)
{
   ::new(t) A(0);
}

問題解決了(感謝阿倫)!

您可以通過使用boost方法序列化非默認可構造對象來解決該問題。 Google提供了save_construct_data和load_construct_data用法示例。

還可以查看將序列化為保存/加載

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM