如何在 boost::serialization 中迭代存档

问题描述 投票:0回答:2

我将多个数据加载到

boost::archive::text_oarchive
中,现在我需要提取数据。 但由于存档包含多个记录,我需要一个迭代器。

类似的东西

//input archive
boost::archive::text_iarchive iarch(ifs);

//read until the end of file
while (!iarch.eof()){

//read current value
iarch >> temp;
...//do something with temp

}

是否有任何标准方法可以迭代存档的元素? 我只找到了

iarchive.iterator_type
,但是这是我需要的吗?我该如何使用它?

c++ iterator boost-serialization
2个回答
0
投票

你正在查看的迭代器类型实际上来自

class shared_ptr_helper {
    ...
    typedef std::set<
        boost::shared_ptr<const void>,
        collection_type_compare
    > collection_type;
    typedef collection_type::const_iterator iterator_type;

我认为它是在加载存档期间使用的,而不是作为外部使用的迭代器。

如果您查看教程 -> STL Collection 下的链接 http://www.boost.org/doc/libs/1_53_0/libs/serialization/doc/index.html,您将看到以下示例:

#include <boost/serialization/list.hpp>

class bus_route
{
    friend class boost::serialization::access;
    std::list<bus_stop *> stops;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & stops;
    }
public:
    bus_route(){}
};

如果这不完全是您所需要的,那么您可能需要查看覆盖负载并按照 http://www.boost.org/doc/libs/1_53_0/libs/serialization/doc/tutorial.html 进行保存#分裂 并根据需要添加处理。


0
投票

虽然没有正式定义,但归档的概念并不包括检测结束的能力。 从某种意义上说,档案应该是自包含的:您应该能够确定地读取(反序列化)正确数量的数据,因为该信息本身就是档案的一部分。

boost::archive::text_iarchive iarch(ifs);

int size;
iach >> size;

for(int i = 0; i != size; ++i) {
  T temp;
  iarch >> temp;
  ...//do something with temp
}

如您所见,没有无限的 while 循环。 即使语法看起来相似,也有一定的逻辑可以将存档与任意数据流区分开来。

话虽如此,对于某些档案,如果您有权访问底层流,则可以检查流是否结束。

boost::archive::text_iarchive iarch(ifs);
while(ifs) {
  T temp;
  iarch >> temp;
  ...//do something with temp
}

然而,大然而,这打破了存档的抽象,并且它不适用于具有标签的存档(如XML存档),因为存档的最后一个条目不一定与底层流的末尾一致.

© www.soinside.com 2019 - 2024. All rights reserved.