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

Json.NET使用TypeNameHandling时如何处理未知派生类型反序列化问题

解决方案

实现自定义的ISerializationBinder即可满足需求,无需修改现有序列化逻辑,也不需要为新增派生类做额外适配:

1. 自定义类型绑定器

继承Json.NET自带的DefaultSerializationBinder,重写类型解析逻辑,当无法匹配到对应的派生类型时,返回你定义的Unknown类型:

public class AnimalTypeBinder : DefaultSerializationBinder
{
    public override Type BindToType(string assemblyName, string typeName)
    {
        try
        {
            // 先走默认的类型解析逻辑
            return base.BindToType(assemblyName, typeName);
        }
        catch (JsonSerializationException)
        {
            // 解析失败且目标是Animal的派生类时,返回Unknown类型
            if (typeof(Animal).IsAssignableFrom(Type.GetType(typeName, false) ?? typeof(object)))
            {
                return typeof(Unknown);
            }
            // 其他类型的解析异常正常抛出
            throw;
        }
    }
}

2. 配置到反序列化参数中

只需要在你现有的JsonSerializerSettings中加一行绑定器配置即可:

var settings = new JsonSerializerSettings()
{
    TypeNameHandling = TypeNameHandling.Objects,
    // 新增自定义类型绑定器
    SerializationBinder = new AnimalTypeBinder()
};

修改后再运行你提供的示例代码,反序列化不会抛出异常,最终得到的deserializedAnimals列表中,第三个元素就是Unknown类型的实例,完全符合预期。

通用扩展说明

如果有多个不同的基类都需要类似的未知类型回退逻辑,可以把绑定器改造成通用版本,初始化时传入基类和对应的回退类型即可,不需要为每个基类单独实现绑定器。

注意:TypeNameHandling特性存在反序列化安全风险,仅建议在客户端和服务端都完全可控的内部通信场景下使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 08:57:03