【问题标题】:serialize data into a consecutive array将数据序列化为连续数组
【发布时间】:2012-11-06 00:35:28
【问题描述】:

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

1) char 的数组是否适合此任务?如果不是,还有什么更好的选择?

2) 这样做最有效的是什么?到目前为止,我所做的是使用memcpy。例如,是否可以将double 转换/转换为chars 的8 个字节,反之亦然,而无需通过memcpy

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

【问题讨论】:

  • 序列化的目标是什么?这可能会推动最佳实施。
  • 文件 I/O 和发送/接收都使用 MPI

标签: c serialization


【解决方案1】:
  1. 是的,char 是该任务的绝佳选择。

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

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

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

对于积分,你可以这样做:

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

这样可以保证得到相同的号码。

【讨论】:

  • 为什么不用htonl和朋友们?
  • @jbowes 这也是一个不错的选择。我想我个人更喜欢转移和分配。
【解决方案2】:

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

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

我会从谷歌搜索“深拷贝”开始。 deep copy vs shallow copy

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

【讨论】:

    猜你喜欢
    • 2021-04-01
    • 2015-07-09
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2017-11-15
    • 2022-01-03
    • 2011-09-21
    • 1970-01-01
    相关资源
    最近更新 更多