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

Unity中使用MessagePack为何无法序列化结构体新增布尔字段?

问题解决:MessagePack新增布尔字段无法序列化

可能的原因及修复方案

1. 显式声明字段序列化特性

MessagePack对结构体新字段的识别有时需要明确标记,给新增的两个布尔字段加上[IgnoreMember(false)](显式取消忽略),确保序列化器能识别到它们:

[MessagePackObject]
public struct Data {
    [Key(0)]
    public Level[] levels;
    [Key(1)]
    public float menuContentScroll;
    [Key(2)]
    public bool musicOn;
    [Key(3)]
    public int worldHighScore;
    [Key(4), IgnoreMember(false)]
    public bool tiltControlsEnabled;
    [Key(5), IgnoreMember(false)]
    public bool autoRestartEnabled;
}

2. 清理旧缓存与存储数据

旧的序列化数据和Unity缓存可能保留了结构体的旧元数据:

  • 删除本地存储的游戏存档文件,让程序重新生成包含新字段的序列化内容
  • 清理Unity项目的Library文件夹(注意备份项目),重置MessagePack的序列化元数据缓存

3. 改用字符串Key测试

数字Key虽高效,但偶尔会因索引映射问题导致字段丢失,尝试替换为字符串Key:

[MessagePackObject]
public struct Data {
    [Key("levels")]
    public Level[] levels;
    [Key("menuContentScroll")]
    public float menuContentScroll;
    [Key("musicOn")]
    public bool musicOn;
    [Key("worldHighScore")]
    public int worldHighScore;
    [Key("tiltControlsEnabled")]
    public bool tiltControlsEnabled;
    [Key("autoRestartEnabled")]
    public bool autoRestartEnabled;
}

4. 显式初始化新字段

结构体作为值类型,未赋值的字段可能被序列化器忽略,实例化Data时务必显式给新字段赋值:

var saveData = new Data {
    levels = existingLevels,
    menuContentScroll = 0f,
    musicOn = true,
    worldHighScore = 1000,
    tiltControlsEnabled = false, // 显式赋值默认值
    autoRestartEnabled = false   // 显式赋值默认值
};

5. 检查序列化解析器配置

如果使用了自定义解析器,确保没有过滤标记字段的规则,比如使用标准解析器:

var options = MessagePackSerializerOptions.Standard;
byte[] bytes = MessagePackSerializer.Serialize(saveData, options);

内容的提问来源于stack exchange,提问作者lomstfer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:42:05