C#中如何在执行反序列化操作前判断目标对象的类类型
方案1:手动添加类型标记(最小改动适配现有架构)
序列化阶段额外将对象类型标识写入文件,反序列化时先读取类型标识再调用对应泛型方法即可,无需修改原有类定义:
修改后的序列化代码
// 写入类型标识 writer.Write(CurrentCar.GetType().Name); // 无需逐个判断类型,直接按实际类型序列化 var JSON_CAR = JsonSerializer.Serialize(CurrentCar, CurrentCar.GetType()); writer.Write(JSON_CAR);
反序列化代码
// 先读取类型标识 string carType = reader.ReadString(); string carJson = reader.ReadString(); CurrentCar = carType switch { nameof(Ford) => JsonSerializer.Deserialize<Ford>(carJson), nameof(Lexus) => JsonSerializer.Deserialize<Lexus>(carJson), nameof(Dodge) => JsonSerializer.Deserialize<Dodge>(carJson), _ => throw new NotSupportedException($"不支持的车型类型:{carType}") };
方案2:使用System.Text.Json原生多态支持(.NET 7及以上版本推荐)
框架原生支持多态序列化鉴别,无需手动处理类型判断逻辑:
- 给汽车基类添加多态特性标注
[JsonDerivedType(typeof(Ford), typeDiscriminator: nameof(Ford))] [JsonDerivedType(typeof(Lexus), typeDiscriminator: nameof(Lexus))] [JsonDerivedType(typeof(Dodge), typeDiscriminator: nameof(Dodge))] public abstract class Car // 你的汽车基类 { // 原有类代码无需修改 }
- 序列化代码直接按基类序列化即可
var JSON_CAR = JsonSerializer.Serialize(CurrentCar, typeof(Car)); writer.Write(JSON_CAR);
- 反序列化直接按基类接收,框架自动匹配子类
CurrentCar = JsonSerializer.Deserialize<Car>(reader.ReadString());
内容的提问来源于stack exchange,提问作者Connor
相关产品推荐
相关产品推荐

