异常:内存位置的boost :: archive :: archive_exception [英] exception: boost::archive::archive_exception at memory location

查看:735
本文介绍了异常:内存位置的boost :: archive :: archive_exception的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我尝试反序列化二进制数据时,得到以下信息:

When I try to deserialize binary data I get this:

exception:boost :: archive :: archive_exception

写:

std::ofstream ofs(savePath);
boost::archive::binary_oarchive out_arch(ofs);
out_arch << mData;
ofs.close();

读取:

std::ifstream ifs(loadPath);
boost::archive::binary_iarchive in_arch(ifs);
in_arch >> _mData;

当我使用text_iarchive \text_oarchive可以正常工作时。

When i use text_iarchive \text_oarchive work fine.

序列化的数据结构mData是 ColorMatrix< std :: map< int,float>> mData;

Serialized data structure mData is ColorMatrix<std::map<int, float>> mData;

#include <algorithm>
#include <memory>
#include <boost/serialization/vector.hpp>

template<class T, class A = std::allocator<T> >
struct ColorMatrix {
    typedef T value_type;
    typedef std::vector<value_type, A> Container;

    ColorMatrix() : _b(0) {}
    ColorMatrix(int a, int b, value_type const& initial = value_type())
        : _b(0)
    {
        resize(a, b, initial);
    }
    ColorMatrix(ColorMatrix const& other)
        : _data(other._data), _b(other._b)
    {}

    ColorMatrix& operator=(ColorMatrix copy) {
        swap(*this, copy);
        return *this;
    }

    bool empty() const { return _data.empty(); }
    void clear() { _data.clear(); _b = 0; }

    int dim_a() const { return _b ? _data.size() / _b : 0; }
    int dim_b() const { return _b; }

    value_type* operator[](int a) {
        return &_data[a * _b];
    }
    value_type const* operator[](int a) const {
        return &_data[a * _b];
    }

    void resize(int a, int b, value_type const& initial = value_type()) {
        if (a == 0) {
            b = 0;
        }
        _data.resize(a * b, initial);
        _b = b;
    }

    void copyTo(ColorMatrix<T, A> &other){

        int myA = dim_a();
        int myB = dim_b();
        int otherB = other.dim_b();

        for (int line = 0; line < myA; ++line){
            int myStart = line * myB;
            int myEnd = (line + 1) * myB;
            int otherStart = line*otherB;

            std::cout << "Line: " << line << " S1: " << myStart << " E1: " << myEnd << " S2: " << otherStart << std::endl;

            std::copy(_data.begin() + myStart,
                _data.begin() + myEnd,
                other._data.begin() + otherStart);
        }
    }

    friend void swap(ColorMatrix& a, ColorMatrix& b) {
        using std::swap;
        swap(a._data, b._data);
        swap(a._b, b._b);
    }


private:
    Container _data;
    int _b;

    friend class boost::serialization::access;

    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & _data;
        ar & _b;
    }
};

UPD1

我在序列化步骤中发现了一个问题。有了测试数据,一切正常。

I found a problem in the serialization step. With test data all ok.

所有正常的测试代码:

#include <iostream>
#include <vector>
#include <math.h>
#include <fstream>
#include <map>
#include <fstream>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/map.hpp>
#include "ColorMatrix.h"

using namespace std;

int main()
{
    cout << "start program" << endl;
    ColorMatrix<std::map<int, float>> mData;
    ColorMatrix<std::map<int, float>> mData2;

    const int mSize = 200;

    mData.resize(mSize, mSize);

    cout << "init" << endl;
    for (int x = 0; x < mSize; x++){
        for (int y = 0; y < mSize; y++){
            if (y % 2 == 0){
                mData[x][y][0] = 1.f;
                mData[x][y][1] = 0.66666f;
            }
            else if (y % 3 == 0){
                mData[x][y][0] = 1.f;
                mData[x][y][1] = 0.1111111111f;
                mData[x][y][3] = 0.44444444f;
            }
            else{
                mData[x][y][0] = 1.f;
            }

        }
    }

    cout << "write data" << endl;
    std::ofstream ofs("data.dat");
    boost::archive::binary_oarchive out_arch(ofs);
    //boost::archive::text_oarchive out_arch(ofs);
    out_arch << mData;
    ofs.close();

    cout << "read data" << endl;
    std::ifstream ifs("data.dat");
    if (!ifs) {
        cout << "read error!" << endl;
        return 1;
    }

    boost::archive::binary_iarchive in_arch(ifs);
    //boost::archive::text_iarchive in_arch(ifs);
    in_arch >> mData2;
    cout << "complete" << endl;
    return 0;
}


推荐答案

两个提示


  • 确保归档的生命周期已关闭,并且明确不要重叠

  • make sure the lifetime of the archives are closed and specifically do not overlap

文本存档有效的事实使我想知道您是否正确编写了二进制流。另请注意,您可以在Boost序列化中将多个档案安全地串联到同一流中。

the fact that text archives work makes me wonder whether you are properly writing binary streams. Also note that you can not concatenate multiple archives to the same steam safely in Boost Serialisation.

我还有另一个答案,详细说明了这种情况以及它对于本站点中的文本归档的工作方式。

I have another answer detailing precisely this situating and how it seems to work for text archives in this site.

更新

在检查了代码之后(谢谢!),我发现了以下内容注意:

After reviewing the code (thanks!) I found the following notes apply:


  1. 实际上是在简单示例中,您无法显式管理归档对象的寿命。我已经看到这会导致问题(在MSVC IIRC上)。您也可以在[SO]上找到它。因此,写:

  1. indeed in the simple sample, you fail to manage the life of the archive objects explicitly. I've seen this lead to problems (on MSVC IIRC). You can also find it on [SO]. So, write:

cout << "write data" << endl;
{
    std::ofstream ofs("data.dat");
    boost::archive::binary_oarchive out_arch(ofs);
    //boost::archive::text_oarchive out_arch(ofs);
    out_arch << mData;
}

cout << "read data" << endl;
{
    std::ifstream ifs("data.dat");
    if (!ifs) {
        cout << "read error!" << endl;
        return 1;
    }

    boost::archive::binary_iarchive in_arch(ifs);
    //boost::archive::text_iarchive in_arch(ifs);
    in_arch >> mData2;
}


  • 您不使用 std: :ios :: binary ,这可能会产生影响(可能取决于平台):

  • you don't use std::ios::binary, this might have impact (perhaps depending on platform):

    std::ofstream ofs("data.dat", std::ios::binary);
    // ...
    std::ifstream ifs("data.dat", std::ios::binary);
    





  • 我还建议改善 ColorMatrix 类中的字段和参数的命名。

    I'd also suggest improving the naming of the fields and parameters in teh ColorMatrix class.

    这篇关于异常:内存位置的boost :: archive :: archive_exception的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆