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

Unity单例反序列化时新增自动属性为null的解决方案问询

Unity单例存档类反序列化自动属性为null的解决办法

问题原因

你遇到的情况核心原因是:

  • 若用JsonUtility.FromJsonOverwrite加载存档到已有的单例实例,反序列化会直接覆盖属性值,旧存档里没有的新增字段会被设为null,而自动属性的= new AppSettings()仅在对象构造时执行,已创建的单例实例不会重新触发这个初始化。
  • 即使是用FromJson创建新实例,部分序列化逻辑也可能跳过自动属性的初始化赋值,导致属性为空。

无需改写全属性的简洁方案

方案1:加载后手动检查初始化

在加载存档的代码末尾,手动补全null的属性,逻辑直接明了:

public void LoadGameProgress()
{
    string saveJson = PlayerPrefs.GetString("GameData");
    JsonUtility.FromJsonOverwrite(saveJson, DataStored.Instance);
    
    // 自动初始化null的属性
    DataStored.Instance.Settings ??= new AppSettings();
}

方案2:反序列化回调自动处理

给DataStored类添加反序列化回调方法,反序列化完成后自动检查并初始化属性,无需修改加载逻辑:

using System.Runtime.Serialization;

public class DataStored : MonoBehaviour
{
    public static DataStored Instance;
    public AppSettings Settings { get; set; }

    private void Awake() => Instance = this;

    // 反序列化完成后触发
    [OnDeserialized]
    private void OnDeserializedCallback(StreamingContext context)
    {
        Settings ??= new AppSettings();
        // 其他需要初始化的属性也可以在这里统一处理
    }
}

方案3:无参构造函数初始化

如果DataStored是普通可序列化类(非MonoBehaviour),或者允许在构造函数中初始化,可直接在无参构造里赋值,反序列化创建新实例时会自动执行:

public class DataStored
{
    public static DataStored Instance;
    public AppSettings Settings { get; set; }

    public DataStored()
    {
        Settings = new AppSettings();
    }
}

注意事项

  • 必须确保AppSettings类被标记为[Serializable],否则序列化器无法识别:
    [Serializable]
    public class AppSettings
    {
        // 你的设置字段
    }
    
  • 使用Unity的JsonUtility时,不要用readonly自动属性,否则无法被反序列化赋值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 03:45:36