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

关于C# BinaryFormatter序列化格式及C语言反序列化实现的咨询

解析C# BinaryFormatter序列化字节流的方法与参考资料

核心格式说明

BinaryFormatter.Serialize()生成的字节流遵循.NET二进制序列化规范,结构大致分为三部分:

  • 魔术头:固定以0x00 0x01 0x00 0x00 0x00开头,用于标识这是.NET二进制序列化流
  • 类型元数据:包含被序列化类的全名、程序集信息、字段定义等,以特定二进制结构存储,长度不固定,需要按格式解析长度字段来跳过或读取
  • 字段数据:严格按照C#类中字段的定义顺序存储原始值,常见类型编码规则如下:
    • int:4字节小端整数,对应C的int32_t
    • string:先读2字节小端长度(表示UTF-16字符数),再读取对应长度的UTF-16LE字节,需转成C的UTF-8字符串使用
    • bool:1字节,0x00为false,0x01为true
    • float/double:遵循IEEE 754标准,和C语言对应类型存储格式一致

编写C反序列化函数的关键步骤

  1. 验证开头的魔术头,确认输入流合法
  2. 解析或跳过类型元数据:如果C端已知目标模型结构,可以解析元数据中的长度字段直接跳过这部分;如果需要动态识别类型,则需要按规范解析元数据中的类型信息
  3. 按预定的字段顺序读取对应字节,转换为C语言的对应类型

可参考的资料方向

  • 微软官方提供的.NET二进制序列化格式规范文档,详细定义了元数据、字段编码的每一个细节
  • 开源社区中的跨语言解析实现:部分开源项目包含C语言解析BinaryFormatter流的代码,可参考其处理元数据、字段解码的逻辑
  • 手动对比分析:用C#序列化一个简单测试模型(比如仅包含int、string字段的类),将字节流输出为十六进制,对比字段值与字节的对应关系,快速推导格式规则

注意事项

  • BinaryFormatter已被微软标记为不安全(存在反序列化远程代码执行风险),新项目建议改用Protobuf、MessagePack等跨语言、安全的序列化方案;若维护旧项目则按上述方案处理
  • 必须保证C和C#的模型字段顺序、类型严格匹配,否则会出现解析错误

内容的提问来源于stack exchange,提问作者Ajith C Narayanan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:50:16