[英]How to use array optimization in boost serialization
我必須序列化一個包含 std::vector 的對象,該對象可以包含數千個成員,該向量大小序列化不能很好地擴展。
根據文檔,Boost 提供了一個包裝類數組,用於包裝向量以進行優化,但它生成相同的 xml 輸出。 深入研究 boost 代碼,我發現了一個名為 use_array_optimization 的類,它似乎控制優化,但默認情況下以某種方式停用。 我還嘗試覆蓋序列化函數但沒有結果。
我想知道如何激活優化,因為 boost 的文檔不清楚。
數組優化背后的想法是,對於可以通過簡單地按原樣“轉儲”其表示形式到存檔的方式來存儲類型的數組,一次“轉儲”整個數組要比“先轉儲”另一個元素快。 。
我從您的問題中了解到您正在使用xml歸檔文件。 數組優化不適用於那種情況,因為元素的序列化仍然意味着要進行轉換。
最后,我使用了BOOST_SERIALIZATION_SPLIT_MEMBER()宏並對兩個用於加載和保存的函數進行了編碼。 保存功能如下所示:
template<class Archive>
void save(Archive & ar, const unsigned int version) const
{
using boost::serialization::make_nvp;
std::string sdata;
Vector2String(vData, sdata);
ar & boost::serialization::make_nvp("vData", sdata);
}
Vector2String函數只是將數據轉換為矢量並將其格式化為std :: string。 加載功能使用了一種反轉編碼的功能。
您有多種方法可以使用 Boost Serialization to XML 將vector
序列化。 根據我在評論中讀到的內容,您正在尋找下面的案例 2。
我認為在包含boost/serialization/vector.hpp
之后你不能改變std::vector
被庫boost/serialization/vector.hpp
,但是你可以用你自己的和接近案例 2 的東西替換那里的代碼。
第一個是使用庫給出的默認值,據我所知不會優化任何東西:
#include <boost/serialization/vector.hpp>
...
std::vector<double> vec(4);
std::iota(begin(vec), end(vec), 0);
std::ofstream ofs{"default.xml", boost::archive::no_header};
boost::archive::xml_oarchive xoa{ofs};
xoa<< BOOST_NVP(vec);
輸出:
<vec>
<count>4</count>
<item_version>0</item_version>
<item>0.00000000000000000e+00</item>
<item>1.00000000000000000e+00</item>
<item>2.00000000000000000e+00</item>
<item>3.00000000000000000e+00</item>
</vec>
#include <boost/serialization/array_wrapper.hpp> // for make_array
...
std::ofstream ofs{"array.xml"};
boost::archive::xml_oarchive xoa{ofs, boost::archive::no_header};
auto const size = vec.size();
xoa<< BOOST_NVP(size) << boost::serialization::make_nvp("data", boost::serialization::make_array(vec.data(), vec.size()));
輸出:
<size>4</size>
<data>
<item>0.00000000000000000e+00</item>
<item>1.00000000000000000e+00</item>
<item>2.00000000000000000e+00</item>
<item>3.00000000000000000e+00</item>
</data>
#include <boost/serialization/binary_object.hpp>
...
std::ofstream ofs{"binary.xml"};
boost::archive::xml_oarchive xoa{ofs, boost::archive::no_header};
auto const size = vec.size();
xoa<< BOOST_NVP(size) << boost::serialization::make_nvp("binary_data", boost::serialization::make_binary_object(vec.data(), vec.size()*sizeof(double)));
<size>4</size>
<binary_data>
AAAAAAAAAAAAAAAAAADwPwAAAAAAAABAAAAAAAAACEA=
</binary_data>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.