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

如何解决接口嵌套列表反序列化时的空引用异常?

问题解决:反序列化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:15:32