簡體   English   中英

將數據序列化代碼從C ++ linux / mac移植到C ++ Windows

[英]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

這樣的二進制序列化在這些平台上應該可以正常工作。 您必須尊重字節順序,但這是微不足道的。 我認為這三個平台在這方面沒有任何沖突。

但是,您確實不能使用寬松的類型規范。 intfloatsize_t大小都可以在平台之間變化。

對於整數類型,請使用cstdint標頭中的嚴格尺寸類型。 uint32_tint32_t等。Windows沒有可用的iirc標頭,但是您可以使用boost / cstdint.hpp。

浮點應該工作,因為大多數編譯器遵循相同的IEEE規范。

C-浮點數的序列化(浮點數,雙精度數)

二進制序列化確實需要徹底的單元測試。 我強烈建議您花時間。

只是一個更瘋狂的猜測:您忘記了以二進制讀取模式打開文件,並且在Windows文件流中將序列13,10轉換為10。

您是否考慮過使用序列化庫或格式,例如:

  • XDR (受libc支持)或ASN1
  • s11n (C ++序列化庫)
  • Json ,一種非常簡單的文本格式,具有許多庫,例如JsonCppJansson ,Jaula等。
  • YAML ,一種更強大的文本格式,具有許多庫
  • 甚至XML ,通常用於序列化目的...

(對於標量的序列化, htonl和伴隨例程應該有所幫助)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM