我有对象,我喜欢能够序列化为连续的字节流。两个问题:
1)char
数组是否适合此任务?如果不是更好的选择?
2)这样做效率最高的是什么?到目前为止,我所做的是使用memcpy
。例如,是否可以将double
转换为chars
的8个字节,反之亦然,而无需通过memcpy
?
我很清楚外部库,但我喜欢学习新东西。
答案 0 :(得分:1)
序列化意味着您正在获取一个对象并给它一个represntation,可以用它来仅使用该表示来完全重建它。通常,序列化适用于文件存储,但它通常用于通过网络传递对象。
因此,通常,使用char或unsigned char工作正常。问题的真正原因是确保您存储对象包含的所有内容。这包括您尝试序列化的对象中引用的对象。
我首先使用谷歌搜索“深拷贝”。 deep copy vs shallow copy
编辑:memcpy是一种“浅拷贝”。
答案 1 :(得分:1)
是的,char是完成任务的绝佳选择。
如果您将结果存储到文件中并在同一架构上再次读取,则memcpy很好。但是如果你想通过套接字传递它或在其他地方打开它,你必须要更加小心。对于浮点和整数类型,表示和结尾始终是一个问题。
不要在float / integer上做一个简单的memcpy(并且避免从缓冲区中更多地抛出它(严格别名和UB))。
对于浮点,查找这两个函数frexp()和ldexp()。网上有很多这样的内容,所以没有必要在这里复制它。
对于积分,你可以这样做:
buffer[0] = integer >> 24;
buffer[1] = integer >> 16;
buffer[2] = integer >> 8;
buffer[3] = integer;
这可以保证获得相同的号码。