我的结构格式如下:
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的差异(这取决于处理器架构)来构建这个跨平台?
我知道有太多的序列化库,它们都经过了很好的测试和广泛使用。但我这样做纯粹是为了学习目的。