如何解决接口嵌套列表反序列化时的空引用异常?
问题解决:反序列化Room类时的NullReferenceException
错误信息
从 'StudentHousingFramework.Modules.Room' 的 'tasksToDo' 获取值时出错。
System.NullReferenceException: 对象引用未设置到对象的实例。
问题场景
我正在尝试反序列化一个接口列表,列表中每个接口内部包含不同类型的接口列表。tasksToDo是Room类中的List<ITask>属性,我认为这是问题的根源。
序列化与反序列化代码
public void Serealise<T>(string nameList, List<T> list) { path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, nameList); string jsonString = JsonConvert.SerializeObject(list, Formatting.Indented, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore, TypeNameHandling = TypeNameHandling.Auto }); File.WriteAllText(path, jsonString); } public List<IAccount>? DeserealiseRoom(string list) { path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, list); if (File.Exists(path)) { var file = File.ReadAllText(path); return JsonConvert.DeserializeObject<List<IAccount>>(file, new JsonSerializerSettings { ReferenceLoopHandling= ReferenceLoopHandling.Ignore, TypeNameHandling= TypeNameHandling.Auto, }); } return null; }
Room类代码
public class Room : IAccount { public Room() { } [JsonIgnore] public List<ITask> tasksToDo { get { return factory.manager.tasks.FindAll(w => w.claimer == this); } } public Login login { get; set; } public bool isOccupied { get; private set; } = true; public int id { get; set; } public string name { get { return "Room " + id; } } public Json json { get; set; } = new Json(); private Factory factory { get; set; } public Room(Factory factory, int id) { this.factory = factory; this.id = id; login = new Login(); } }
解决方案
问题根源
反序列化时,Json.NET会调用Room的无参构造函数,此时factory字段为null。虽然tasksToDo加了[JsonIgnore],但反序列化过程中框架仍会尝试访问该属性的getter,导致访问factory.manager.tasks时触发空引用异常。
修复方法
方法1:给tasksToDo的getter增加空值检查
直接在属性的getter里逐层判断是否为空,避免空引用:
[JsonIgnore] public List<ITask> tasksToDo { get { if (factory == null || factory.manager == null || factory.manager.tasks == null) return new List<ITask>(); return factory.manager.tasks.FindAll(w => w.claimer == this); } }
方法2:初始化factory字段(可选)
如果Factory类支持无参实例化,可在无参构造函数中初始化factory:
public Room() { factory = new Factory(); // 仅适用于Factory可独立初始化的场景 }
若Factory是依赖注入的实例,优先使用方法1。
内容的提问来源于stack exchange,提问作者CitrusBoy
相关产品推荐
相关产品推荐

