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

