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

