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

C#中NewtonSoft反序列化属性子类变父类问题求助

问题描述

我在将OfflineTransaction对象的泛型列表序列化为JSON文件时,反序列化阶段出现异常:OfflineTransaction的DBRecord属性在JSON文件中明确标记为子类NewEvent,但反序列化后却被解析为父类NewDBRecord。

JSON片段示例

{
  "$type": "DTData.Offline.OfflineTransaction, DTData",
  "ExtraData": null,
  "SqlStatement": "",
  "StoredProcedure": "",
  "OracleParameters": null,
  "DBRecord": {
    "$type": "DTData.Data.NewDBRecord.NewEvent, DTData",
    // ... 其他属性内容
  }
}

序列化代码

List<OfflineTransaction> offlineTransactionsList = new List<OfflineTransaction>(offlineTransactions);
var settings = new JsonSerializerSettings();
settings.Formatting = Formatting.Indented;
settings.TypeNameHandling = TypeNameHandling.All;
var jsonString = JsonConvert.SerializeObject(offlineTransactionsList, settings);
File.WriteAllText(fileName, jsonString);

当前反序列化代码(存在问题)

var result = JsonConvert.DeserializeObject<List<OfflineTransaction>>(File.ReadAllText(fileName));
解决方法

反序列化时必须传入与序列化阶段相同的JsonSerializerSettings,显式设置TypeNameHandling为All(或匹配序列化时的取值),这样Json.NET才会读取JSON中的$type标记,正确将DBRecord解析为子类NewEvent。

修改后的反序列化代码:

var settings = new JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.All
};
var result = JsonConvert.DeserializeObject<List<OfflineTransaction>>(File.ReadAllText(fileName), settings);

注意事项

  • TypeNameHandling的取值需与序列化时保持一致,否则会导致类型解析错误。
  • 若需规避安全风险(如恶意类型注入),可搭配SerializationBinder限制允许反序列化的类型范围,降低潜在漏洞。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:15:29