You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 13:55:20