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

Unity中BinaryFormatter反序列化报错:No map for object问题求助

Unity反序列化报错:No map for object '201326592' 解决方案

问题根源

你犯了一个核心错误:用文本处理逻辑操作二进制序列化文件。Resources文件夹中的items是BinaryFormatter生成的二进制数据,但你通过TextAsset读取后用File.WriteAllText写入,这个过程会把二进制数据转成字符串再存储,破坏了原始二进制结构,导致反序列化时无法识别数据格式,进而抛出该错误。

修复步骤

1. 修正文件复制逻辑(用二进制流处理)

替换原复制代码,直接读取原始二进制数据并写入,避免文本转换:

public void CopyAndDeserialize()
{
    saveData.itemsOfClothing = new List<ItemsOfClothingData.ItemOfClothing>();
    // 读取Resources中的二进制文件(TextAsset的bytes属性保留原始二进制数据)
    TextAsset resourcesBinaryData = Resources.Load<TextAsset>("items");

    // 修正Path.Combine用法:不要手动拼接字符串,直接传入路径片段
    path = Path.Combine(StorageManager.Instance.GlobalPath, _saveFileName);

    // 直接写入二进制字节数组,自动创建/覆盖文件
    File.WriteAllBytes(path, resourcesBinaryData.bytes);

    DeserializeData();
}

2. 优化反序列化方法(修复流处理与错误描述)

原代码存在重复关闭流、错误描述用词不当的问题,改用using自动管理流资源:

public void DeserializeData()
{
    path = Path.Combine(StorageManager.Instance.GlobalPath, _saveFileName);

    if (File.Exists(path))
    {
        // using语句自动释放文件流,无需手动Close
        using (var fileStream = new FileStream(path, FileMode.Open))
        {
            BinaryFormatter binaryFormatter = new BinaryFormatter();
            try
            {
                saveData = (ItemsOfClothingData)binaryFormatter.Deserialize(fileStream);
            }
            catch (SerializationException e)
            {
                // 修正错误描述:是反序列化失败而非序列化
                MonoBehaviour.print("Failed to deserialize. Reason: " + e.Message);
                throw;
            }
        }
    }
}

额外注意事项

  • 确认Resources中的items文件是**BinaryFormatter序列化生成的原始二进制文件**,而非JSON等文本格式。
  • BinaryFormatter在Unity中已被标记为过时(Obsolete),存在安全风险与兼容性问题,建议改用JsonUtility、Newtonsoft.Json或Protobuf-net等更安全的序列化方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 22:12:24