Зло ли сериализовать объекты структуры с использованием memcpy?
В одном из моих проектов я делаю следующее: я запоминаю структурный объект, кодирую base64 и записываю его в файл.Я делаю обратное при разборе данных.Кажется, все работает нормально, но в определенных ситуациях (например, при использовании WINDOWPLACEMENT
для HWND проигрывателя Windows Media) оказывается, что декодированные данные не совпадают с sizeof(WINDOWPLACEMENT)
.
. Вот некоторыефрагменты кода:
// Using WINDOWPLACEMENT from Windows API headers:
typedef struct tagWINDOWPLACEMENT {
UINT length;
UINT flags;
UINT showCmd;
POINT ptMinPosition;
POINT ptMaxPosition;
RECT rcNormalPosition;
#ifdef _MAC
RECT rcDevice;
#endif
} WINDOWPLACEMENT;
static std::string EncodeWindowPlacement(const WINDOWPLACEMENT & inWindowPlacement)
{
std::stringstream ss;
{
Poco::Base64Encoder encoder(ss); // From the Poco C++ libraries
const char * offset = reinterpret_cast<const char*>(&inWindowPlacement);
std::vector<char> buffer(offset, offset + sizeof(inWindowPlacement));
for (size_t idx = 0; idx != buffer.size(); ++idx)
{
encoder << buffer[idx];
}
encoder.close();
}
return ss.str();
}
static WINDOWPLACEMENT DecodeWindowPlacement(const std::string & inEncoded)
{
std::string decodedString;
{
std::istringstream istr(inEncoded);
Poco::Base64Decoder decoder(istr); // From the Poco C++ libraries
decoder >> decodedString;
assert(decoder.eof());
if (decoder.fail())
{
throw std::runtime_error("Failed to parse Window placement data from the configuration file.");
}
}
if (decodedString.size() != sizeof(WINDOWPLACEMENT))
{
// !! Occurs frequently !!
throw std::runtime_error("Errors occured during parsing of the Window placement.");
}
WINDOWPLACEMENT windowPlacement;
memcpy(&windowPlacement, &decodedString[0], decodedString.size());
return windowPlacement;
}
Я знаю, что копирование классов в C ++ с использованием memcpy может вызвать проблемы, потому что конструкторы копирования не выполняются должным образом.Я не уверен, относится ли это также к структурам в стиле C.Или же сериализация с помощью дампа памяти просто не выполнена ?
Обновление: ошибка в Base64Encoder / Decoder Poco не является невозможной, но маловероятной.Его тестовые примеры кажутся довольно тщательными: Base64Test.cpp .