自定义DepthUpdate结构体二进制序列化/反序列化异常排查求助
问题排查与解决
核心问题分析
你遇到的加载后bp_前几个元素变为0的问题,主要由以下两个原因导致:
1. 文件未以二进制模式打开
你的代码中打开文件时仅使用了std::ios::out和std::ios::in,未指定std::ios::binary模式。在文本模式下,系统会对某些字节(如换行符、EOF标记)进行自动转换,破坏二进制数据的完整性。对于包含全0的double值(如你测试数据中的0),文本模式可能会导致数据被截断或篡改,从而出现bp_前几个元素变为0的异常。
2. const成员变量的潜在未定义行为
结构体中的bid_length_和ask_length_被声明为const size_t,在加载数据时,你直接通过内存指针修改结构体的这部分内容(从文件读取到内存),这属于C++中的未定义行为。编译器可能会对const成员做优化,导致读取的长度值不正确,进而影响指针偏移计算,间接破坏bp_的数据。
修复方案
方案1:使用二进制模式打开文件
修改文件打开代码,添加std::ios::binary标志:
// Dump部分 std::fstream f; f.open("a.bin", std::ios::out | std::ios::binary); // Load部分 std::fstream f; f.open("a.bin", std::ios::in | std::ios::binary);
方案2:将const成员改为非const
将结构体中的const size_t bid_length_, ask_length_改为普通size_t:
struct DepthUpdate { // ... 其他成员 ... size_t bid_length_, ask_length_; // 移除const修饰 // ... 其他成员 ... };
同时调整构造函数的初始化方式(非const成员后续可修改,更符合加载逻辑)。
方案3:修正Show函数的输出顺序(可选)
你的Show函数中,bid_length_和ask_length_的输出与实际构造值不符(代码中构造的是16,但输出显示6),可能是printf参数顺序错误。确保参数与格式字符串一一对应:
fprintf(stream, "%ld %ld %ld %ld | %zu %zu | %zu %zu | %s %zu", t_.tv_sec, t_.tv_usec, ex_t_.tv_sec, ex_t_.tv_usec, data_type_, type_, bid_length_, ask_length_, ticker_, exchange_);
验证修复效果
应用上述修复后,重新运行测试代码,bp_的元素应能正确加载,与Dump前的数据一致。
内容的提问来源于stack exchange,提问作者nealh
相关产品推荐
相关产品推荐

