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