我目前正在重新设计应用程序,偶然发现序列化某些数据时遇到的问题。

说我有一个大小为mxn的数组

double **data; 我想序列化为的

char *dataSerialized

使用简单的定界符(一个用于行,一个用于元素)。

反序列化非常简单,它可以计算定界符并为要存储的数据分配大小。但是,说序列化功能怎么样

serialize_matrix(double **data, int m, int n, char **dataSerialized);

确定char数组所需的大小并为其分配适当的内存的最佳策略是什么?

也许在字符串中使用double的某个固定宽度的指数表示形式?是否可以将double的所有字节都转换为char并具有sizeof(double)对齐的char数组?我如何保持数字的准确性?

注意:

我需要将数据存储在char数组中,而不是二进制文件中,而不是文件中。

序列化的数据将使用C服务器和Java客户端之间的ZeroMQ通过网络发送。鉴于数组的尺寸和sizeof(double)是否有可能始终能够在这两个数组之间准确地重建?

有帮助吗?

解决方案

Java对读取原始字节并将其转换为所需内容提供了很好的支持。 您可以选择一种简单的线格式,然后在C中序列化为该格式,然后在Java中进行反序列化。

这是一个非常简单的格式示例,其中包含用于反序列化和序列化的代码。

我编写了一个稍大的测试程序,如果需要,可以将其转储到某个地方。它在C中创建一个随机数据数组,进行序列化,并将序列化的字符串base64编码后的字符串写入stdout。然后,更小的Java程序对此进行读取,解码和反序列化。

要序列化的C代码: 通用标签

要反序列化的Java代码: 通用标签

其他提示

如果您正在编写二进制文件,则应考虑序列化生成的生成的实际二进制数据(64位)的好方法。这可以从直接将双倍到文件(心灵的endianness)的内容写入到更多详细的归一化序列化方案(例如,具有明确定义的NaN的表示)。这就是你真的。如果您希望基本上是同类架构中,直接内存转储可能就足够了。

如果要写入文本文件和a正在寻找ASCII表示,我会强烈阻止十进制数值表示。相反,您可以使用Base64或类似的东西将64位原始数据转换为ASCII。

你真的想保留你的double中拥有的所有精度!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top