题
我目前正在重新设计应用程序,偶然发现序列化某些数据时遇到的问题。
说我有一个大小为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
中拥有的所有精度!