以下の例では、生のCポインタとそのデータをシリアル化して逆シリアル化しようとしています。それはうまくシリアル化するようだが、私はそれをdeserializeにする方法がわかりません - それは私がそれを逆シリアル化するときにメモリアクセス違反の例外でクラッシュします。それは、それを逆シリアル化する方法を知っていないからだと思いますが、どこでそれを指定しますか?ベクターを用いて生のC配列の逆シリアル化、逆シリアル化
はオプションではありません非常に大規模なプリミティブデータにデシリアライズしながら、それは
#include <stdint.h>
#include <string>
#include <iostream>
#include <fstream>
#pragma warning (push)
#pragma warning(disable : 4244)
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/array.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#pragma warning (pop)
struct Monkey
{
uint32_t num;
float* arr;
};
namespace boost
{
namespace serialization
{
template<class Archive>
void serialize(Archive & ar, Monkey& m, const unsigned int version)
{
ar & m.num;
ar & make_array<float>(m.arr, m.num);
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
const char* name = "monkey.txt";
{
Monkey m;
m.num = 10;
m.arr = new float[m.num];
for (uint32_t index = 0; index < m.num; index++)
m.arr[index] = (float)index;
std::ofstream outStream(name, std::ios::out | std::ios::binary | std::ios::trunc);
boost::archive::binary_oarchive oar(outStream);
oar << (m);
}
Monkey m;
std::ifstream inStream(name, std::ios::in | std::ios::binary);
boost::archive::binary_iarchive iar(inStream);
iar >> (m);
return 0;
}
私は自分の答えを書くようになりましたが、@すべてのコードとすべての問題を既に入れました。私は要約を追加するだけで、ここにある内容を言い換えるだけです。あなたの本当の問題は、デシリアライズそのものではなく、メモリ管理です。 struct Monkeyが使用するメモリの割り当て、コピー、または割り当て解除の仕方は指定していません。 Seheは、このメモリ管理の問題を解決する2つのきれいな方法を提供しました(ベクトルを使用するか、コピーctor、dtorなどを追加/削除します)。 –