写入文件时,以下数据是否跨平台兼容?

时间:2017-08-29 10:48:48

标签: c++ serialization cross-platform fstream

我的结构格式如下:

struct Serializable {
    uint64_t value1;
    uint32_t value2;
    uint16_t value3;
    uint8_t  value4;

    // returns the raw data after converting the values to big-endian format 
    // if the current architecture follows little-endian format. Else, if 
    // if the current architecture follows big-endian format, the return 
    // expression will be "return (char*) (this);" 
    char* convert_all_to_bigendian();

    // checks if the architecture follows little-endian format or big-endian format. 
    // If the little-endian format is followed, after the contents of rawdata 
    // are copied back to the structure, the integer fields are converted back to their,
    // little-endian format (serialized data follow big-endian format by default).
    char* get_and_restructure_serialized_data(char* rawdata);
    uint64_t size();


} __attribute__ ((__packed__)); 

size()成员的实施:

uint64_t Serializable::size() {
     return sizeof(uint64_t) + sizeof(uint32_t) +
            sizeof(uint16_t) + sizeof(uint8_t);
}

如果我使用fstream将上述结构的对象写入文件,如下面的代码所示:

std::fstream fWrite ("dump.dat", std::ios_base::out | std::ios_base::binary);
 // obj is an object of the structure Serializable.
fWrite.write (obj.convert_all_to_bigendian(), obj.size()); 

写入文件dump.dat的内容是否会跨平台?

假设我编写的另一个类和结构与使用Visual C ++相当,那么 Windows端应用程序是否会像Linux方那样解释dump.dat文件?

如果没有,你可以解释除了填充之外我还应该考虑哪些其他因素以及Endianness的差异(这取决于处理器架构)来构建这个跨平台?

我知道有太多的序列化库,它们都经过了很好的测试和广泛使用。但我这样做纯粹是为了学习目的。

0 个答案:

没有答案