Ich versuche, rohe C-Zeiger und ihre Daten zu serialisieren und zu deserialisieren, mit dem Beispiel unten. Es scheint serialisieren gut, aber ich bin mir nicht sicher, wie es deserialize - es stürzt nur mit einer Speicherzugriffsverletzung Ausnahme, wenn ich es deserialize. Ich nehme an, es ist, weil es nicht wissen kann, wie man es deserialisiert, aber wo soll ich das spezifizieren?Boost Serialisierung, Deserialisierung von Raw C-Arrays
unter Verwendung eines Vektors ist keine Option, in sehr großen primitiven Datenmengen es quälend langsam ist
#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;
}
Ich fing an, meine eigene Antwort zu schreiben, aber @sehe legte den gesamten Code und alle Probleme bereits.Ich kann nur meine Zusammenfassung hinzufügen, nur umformulieren, was hier drin ist: Ihr wirkliches Problem ist nicht die Deserialisierung an sich, sondern die Speicherverwaltung. Sie haben nicht angegeben, wie der struct Monkey den von ihm verwendeten Speicher zuweist, kopiert oder freigibt. Sehe gab zwei saubere Möglichkeiten, um dieses Speicherverwaltungsproblem zu lösen (entweder verwende Vektor oder addiere/lösche Kopie ctor, dtor, etc.). –