3

我必须序列化一个对象,该对象包含一个std::vector<unsigned char>可以包含数千个成员的对象,而该向量大小的序列化不能很好地扩展。

根据文档,Boost 提供了一个包装类数组,用于包装向量以进行优化,但它会生成相同的 xml 输出。在 boost 代码中潜水,我发现了一个名为的类use_array_optimization,它似乎可以控制优化,但默认情况下会以某种方式停用。我也试图覆盖没有结果的序列化函数。

我想知道如何激活优化,因为 boost 中的文档不清楚。

4

3 回答 3

0

数组优化背后的想法是,对于可以通过简单地将它们的表示“转储”到存档中来存档的类型数组,一次“转储”整个数组比“转储”一个又一个元素要快.

我从您的问题中了解到您正在使用 xml 存档。数组优化不适用于这种情况,因为元素的序列化无论如何都意味着转换。

于 2009-11-04T17:16:36.160 回答
0

最后,我使用了 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。加载函数使用反转编码的函数。

于 2009-11-06T07:28:27.567 回答
0

您有几种方法可以vector使用 Boost Serialization 将 a 序列化为 XML。根据我在评论中看到的内容,您正在寻找下面的案例 2。

我认为你不能std::vector在 include 之后改变库的序列化方式boost/serialization/vector.hpp,但是你可以用你自己的代码和接近案例 2 的东西替换那里的代码。

0.库默认,未优化

第一个是使用库给出的默认值,据我所知不会优化任何东西:

#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>

1.手动,使用该数据是连续的

#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>

2. 手动,使用二进制且连续的数据

#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>

我认为这使得 XML 在技术上不可移植。

于 2021-11-28T11:14:10.673 回答