シリアルライブラリを使用してstd :: length例外に直面して、自分のクラスの完全なstd :: vectorをデシリアライズします。私はいくつかのコードを与えるのが最も簡単だと思います。これは私のクラスです:シリアル変換のトラブルシューティングPortableBinaryArchive
#include "cereal/archives/portable_binary.hpp"
#include "cereal/archives/json.hpp"
#include "cereal/types/vector.hpp"
enum class myType {
None, unset, Type1, Type2, Type3
};
class myClass
{
public:
myClass();
myClass(size_t siz);
~myClass();
std::vector<size_t> idxs;
myType dtype;
bool isvalid;
// This method lets cereal know which data members to serialize
template<class Archive>
void serialize(Archive & archive)
{
archive(CEREAL_NVP(dtype), CEREAL_NVP(isvalid), CEREAL_NVP(idxs));
}
protected:
private:
};
idxsメンバーは必ずしも同じサイズである必要はありません。 いくつかの計算の後、私はその後、私はシリアライズし、後で別のアプリケーションで非直列化する
std::vector<myClass> allData;
を得ます。これは、直列化のために私のコードです:
std::ofstream ofile(allDataFilename.c_str());
if (ofile.good())
{
cereal::PortableBinaryOutputArchive theArchive(ofile);
theArchive(allData);
//ofilefp.close(); // Do not close because of RAII where dtor of cereal archive does some work on file!
}
else
{
std::cout << "Serialization to portable binary archive failed. File not good." << "\n";
}
生成されたデータファイルがnullのサイズではなく、すべてがゼロなので、ちょうどそれは結構です外見からではありません。 これは私が他のアプリケーションにデシリアライズするために行うものです:私はこのデシリアライズコードを実行すると
std::string allDataFilename("C:\\path\\to\\file\\data.dat");
std::ifstream infile(allDataFilename.c_str());
std::vector<myClass> myDataFromDisk;
if (infile.good())
{
cereal::PortableBinaryInputArchive inArchive(infile);
inArchive >> myDataFromDisk;
}
else
{
std::cout << "Data file unavailable." << "\n";
}
、私は例外「のstd :: length_error」を取得します。どういうわけか、このエラーの関連する議論はhereですが、私にとっては私の場合には関係がないようです。 (それともですか?)私は穀物のドキュメントのこの部分は、ここで適用されるかどうかわからなかったので、私は、機能を保存/ /デ別々の負荷と直列化しようとした
:
可能性は、それがあります単一の内部直列化 メソッドを使用することをお勧めしますが、必要なときに分割メソッドを使用できます(たとえば、クラスをロードするときに に動的にメモリを割り当てる)。
私も(それが内部的にとにかく穀物で行われているように)forループベースの範囲で個別にidxsメンバーの各ベクトル要素をアーカイブしようとしたが、両方の事は助けにはなりませんでした。
両方のアプリケーションはVisual Studio 2015 Update 3でコンパイルされています。私は現在のシリアルv1.2.2を使用していますが、ビットシリアル化の結果を与えるシリアルv1.1.2でも試しました。
脇に:シリアルJSONアーカイブで動作します。しかし、ベクタメンバーがシリアライズに最初に来たとき、それはJSONでは動作しなかった私は
archive(CEREAL_NVP(dtype), CEREAL_NVP(isvalid), CEREAL_NVP(idxs));
にシリアライズコールを変更した後にのみ。しかし、これは完全に無関係かもしれません。
archive(CEREAL_NVP(idxs), CEREAL_NVP(dtype), CEREAL_NVP(isvalid));
今私の質問:
1)これは直列化が穀物で動作するようになっている方法ですか?
2)シリアル化関数を追加する必要がありますか?例えば。 enumクラスに?
std :: ios :: binaryフラグを指定しても効果がありませんでした。オペレータ>>の代わりに演算子()を使用しても、変更は行われませんでした。 私はもっと深く掘り下げて、私の例をさらに引き下げたり、同じアプリ内で読み込んだりしなければならないと思います。 – AverageCoder
同じアプリケーション内でシリアライズおよびデシリアライズすることで違いはありません。それはまた失敗する。次のことは次のことです:私のallData std :: vectorは最終的に終わるもの(size
AverageCoder
シリアルは、ロード中にベクトルを適切にリサイズします。予約された容量では何の違いもありません。投稿した例とシリアルウェブサイトの例をもう一度見てみることをお勧めします。あなたの記述から、あなたの問題の原因となっている単純なインタフェースエラーをどこかに作っていると思います。 – Azoth