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
相关产品推荐
相关产品推荐

