2012-10-03 44 views
6

我在我正在做的應用程序中有問題。我需要使用boost序列化序列化一些數據包。根據文檔,可以分別使用BOOST_CLASS_EXPORT_KEYBOOST_CLASS_EXPORT_IMPLEMENT到.hpp和.cpp文件中,以便能夠使用多態基指針對派生類進行序列化。boost序列化和register_type

因此,這裏是我:

.HPP:containaing我班宣言和finaly的BOOST_CLASS_EXPORT_KEY(mynamespace::mypacket)

的.cpp:包含我的類定義和BOOST_CLASS_EXPORT_IMPLEMENT(mynamespace::mypacket)

一切都正常運行,直到這一點但是當需要序列化時,我得到一個bad_alloc錯誤。

我通過明確地調用我需要使用的存檔上的方法register_type<mypacket>()來解決此問題。

但是,這裏是我的問題:boost的EXPORT *是爲了避免調用register_type方法還是我做錯了什麼?我覺得在我的代碼中做兩次相同的工作,但更重要的是,如果我們仍然必須在歸檔中使用register_type,則我不會看到使用export key + implement的任何優勢!

我在這裏和其他地方閱讀了一些其他帖子,似乎我不是唯一一個試驗這個問題的人,但我還沒有找到任何答案。

回答

8

我想出瞭如何避免在存檔上調用register_type。對於那些可能感興趣的人,需要做模板序列化專業化以及導出key + implement。

因此,這裏是你的.HPP應該是什麼樣子:

  • 類聲明(myNameSpace對象:: MyClass的)
  • 類出口:BOOST_CLASS_EXPORT_KEY(mynamespace::myclass)

而在CPP:

  • class definiton
  • 級出口:BOOST_CLASS_EXPORT_IMPLEMENT(mynamespace::myclass)
  • AND:連載()你需要使用檔案成員的專業化,爲每個類:

template void mynamespace::mypacket::serialize(boost::archive::text_iarchive& arch, const unsigned int version);

template void mynamespace::mypacket::serialize(boost::archive::text_oarchive& arch, const unsigned int version);

哪裏的boost ::檔案:: text_(i/o)歸檔應該替換爲您正在使用的任何類型的boost檔案。

在希望這會幫助別人一天(這顯然是寫在boost documentation,但我一定是錯過了它直到今天......)

+0

謝謝!如果可以的話,我會給你+10,你救了我的命!整天我有一些類的boost :: serialization :: extended_type_info :: get_key()'返回NULL。只有一些用於類,而另一些則完美地工作,並且它正確地返回字符串化的名稱。這就是原因!我沒有分兩步分出'EXPORT'進程!我只是在''.cpp'文件中使用'BOOST_CLASS_EXPORT(CLASS)',而不是'.cpp'中'.h'和'BOOST_CLASS_EXPORT_IMPLEMENT(CLASS)'中的'BOOST_CLASS_EXPORT_KEY(CLASS)'。 **再次感謝!!! ** :) – Avio

+0

如果我對你和doc做同樣的事情,我會得到'void myclass :: serialize(...)的未定義引用。 – Shibli