#include <iostream>
#include <fstream>
class Serializer
{
private:
std::ostream& m_log;
public:
Serializer(std::ostream& log) : m_log(log)
{
}
void WriteToStream(const void* data, size_t len, std::ostream& strm);
void ReadFromStream(const void* dest, size_t destsize, std::istream& strm);
};
void Serializer::WriteToStream(const void* data, size_t len, std::ostream& strm)
{
char* binpointer = (char*)data;
try
{
for(size_t i = 0; i < len; ++i)
strm << *(binpointer + i);
}
catch(std::exception& ex)
{
m_log << ex.what() << std::endl;
}
}
void Serializer::ReadFromStream(const void* dest, size_t destsize, std::istream& strm)
{
char* binpointer = (char*)dest;
try
{
for(size_t i = 0; i < destsize; ++i)
strm >> *(binpointer + i);
}
catch(std::exception& ex)
{
m_log << ex.what() << std::endl;
}
}
// Beispiel
#pragma pack(1)
struct Circle
{
float x, y, z, radius;
};
#pragma pack()
int main(int argc, const char* argv[])
{
std::ofstream errorlog("Errors.txt", std::ios::out);
Serializer seri(errorlog);
std::ofstream ofstr("output.bin", std::ios::binary);
Circle ci;
ci.x = 1.0f;
ci.y = 2.0f;
ci.z = 3.5f;
ci.radius = 22.5f;
seri.WriteToStream(&ci, sizeof(ci), ofstr);
ofstr.close();
Circle in;
std::ifstream istr("output.bin", std::ios::binary);
seri.ReadFromStream(&in, sizeof(in), istr);
std::cout << in.x << " " << in.y << " " << in.z << " " << in.radius;
errorlog.close();
istr.close();
return 0;
}