将二进制文件从Windows传递到iPhone是否安全,如下所示:
std::ostream stream = // get it somehow
stream.write(&MyHugePODStruct, sizeof(MyHugePODStruct));
,如下所示:
std::istream stream = // get it somehow
stream.read(&MyHugePODStruct, sizeof(MyHugePODStruct));
虽然MyHugePODStruct
的定义是一样的吗?如果没有有任何方法可以使用标准库(包括c ++ 11)或安全升级来序列化这个?是否有更干净的方式,因为它似乎是一个不可移植的代码?
答案 0 :(得分:1)
不,原因很多。首先,这不会编译,因为您必须将char *
传递给read
和write
。其次,这并不保证甚至可以在单个平台上工作,因为结构可能包含填充(但是在代码的不同编译版本之间,即使在同一平台上,它们本身也可能不同)。接下来,需要考虑的64/32位问题会影响许多基本类型(例如,long double
在x86上填充为12个字节,但在x64上填充为16个字节)。最后但并非最不重要的是有字节序(虽然我不确定iOS字节序是什么)。
所以简而言之,不,不要那样做。
您必须单独序列化每个struct成员,并根据其数据类型。
你可能想查看Boost.serialization,虽然我没有经验。