[英]Porting data serialization code from C++ linux/mac to C++ windows
我有一個已在Mac和Linux上成功編譯並運行的軟件框架。 我現在正嘗試將其移植到Windows(使用mingw)。 到目前為止,我已經在Windows下編譯並運行了該軟件,但是它不可避免地存在錯誤。 特別是,我在讀取在macOS(或Linux)中序列化的數據到程序的Windows版本(segfaults)時遇到問題。
序列化過程將原始變量(longs,ints,doubles等)的值序列化到磁盤。
這是我正在使用的代碼:
#include <iostream>
#include <fstream>
template <class T>
void serializeVariable(T var, std::ofstream &outFile)
{
outFile.write (reinterpret_cast < char *>(&var),sizeof (var));
}
template <class T>
void readSerializedVariable(T &var, std::ifstream &inFile)
{
inFile.read (reinterpret_cast < char *>(&var),sizeof (var));
}
因此,為了保存一堆變量的狀態,我依次為每個變量調用serializeVariable。 然后,要讀回數據,將以保存它們的順序調用readSerializedVariable。 例如保存:
::serializeVariable<float>(spreadx,outFile);
::serializeVariable<int>(objectDensity,outFile);
::serializeVariable<int>(popSize,outFile);
並閱讀:
::readSerializedVariable<float>(spreadx,inFile);
::readSerializedVariable<int>(objectDensity,inFile);
::readSerializedVariable<int>(popSize,inFile);
但是在Windows中,讀取序列化數據失敗。 我猜想Windows對數據序列化的方式有些不同。 我想知道是否有一種方法可以修改上面的代碼,以便可以在任何其他平台上讀取保存在任何平台上的數據……有什么想法?
干杯,
本
這只是一個瘋狂的猜測,我無法為您提供更多幫助。 我的想法是字節順序不同:大字節序與小字節序。 因此,如果在順序相反的機器上加載任何大於一個字節的內容,都會被弄亂。
例如,我在msdn中發現了這種代碼寧靜:
int isLittleEndian() {
long int testInt = 0x12345678;
char *pMem;
pMem = (char *) testInt;
if (pMem[0] == 0x78)
return(1);
else
return(0);
}
我猜您在Linux和Windows上會有不同的結果。 最好的情況是,您的編譯器有一個標志選項可以使用一種格式或另一種格式。 只需在所有計算機上將其設置為相同即可。
希望這會有所幫助,Alex
這樣的二進制序列化在這些平台上應該可以正常工作。 您必須尊重字節順序,但這是微不足道的。 我認為這三個平台在這方面沒有任何沖突。
但是,您確實不能使用寬松的類型規范。 int
, float
, size_t
大小都可以在平台之間變化。
對於整數類型,請使用cstdint標頭中的嚴格尺寸類型。 uint32_t
, int32_t
等。Windows沒有可用的iirc標頭,但是您可以使用boost / cstdint.hpp。
浮點應該工作,因為大多數編譯器遵循相同的IEEE規范。
二進制序列化確實需要徹底的單元測試。 我強烈建議您花時間。
只是一個更瘋狂的猜測:您忘記了以二進制讀取模式打開文件,並且在Windows文件流中將序列13,10轉換為10。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.