2

我有一些我希望能够序列化为连续字节流的对象。两个问题:

1) 数组char适合这个任务吗?如果不是,有什么更好的选择?

2)这样做最有效的是什么?到目前为止,我所做的是使用memcpy. 例如,是否可以在不经过的情况下将 a 转换double为 8 个字节,chars反之亦然memcpy

我很清楚这方面的外部库,但我喜欢学习新东西。

4

2 回答 2

1

序列化意味着您正在获取一个对象并为其提供一个表示,该表示可用于仅使用该表示来完全重建它。通常,序列化适用于文件存储,但它通常用于通过网络通信对象。

所以,通常,使用 char 或 unsigned char 就可以了。问题的真正意义在于确保您存储了对象包含的所有内容。这包括在您尝试序列化的对象中引用的对象。

我会从谷歌搜索“深拷贝”开始。深拷贝与浅拷贝

编辑:memcpy 是“浅拷贝”的一种形式。

于 2012-11-06T00:43:01.870 回答
1
  1. 是的,char 是该任务的绝佳选择。

  2. 如果您将结果存储到文件中并在同一架构上再次读取,则 memcpy 很好。但是如果你想通过套接字传递它或在其他地方打开它,你必须更加小心。对于浮点和整数类型,表示和字节顺序始终是一个问题。

不要在浮点数/整数上执行简单的 memcpy(并避免更多地从缓冲区强制转换(严格别名和 UB))。

对于浮点数,查找这两个函数 frexp() 和 ldexp()。网上有很多这样的,所以这里没有复制的意义。

对于积分,您可以执行以下操作:

buffer[0] = integer >> 24;  
buffer[1] = integer >> 16;  
buffer[2] = integer >> 8;  
buffer[3] = integer;

这保证了返回相同的号码。

于 2012-11-06T01:07:36.520 回答