无论如何在 C# 中反序列化之前检查对象的 class 类型?

Is there anyway to check the class type of an object BEFORE deserializing in C#?

例如,我有几种类型的汽车被序列化为 .car 文件(这是一个学校项目)。我有三种不同的类型,福特、雷克萨斯和道奇。我可以很好地拯救他们。但是对于我程序的当前架构,当我反序列化时,我需要在反序列化之前知道类型。例如我是这样序列化的:

if (CurrentCar.GetType() == typeof(Ford))
{
   var JSON_CAR = JsonSerializer.Serialize((Ford)CurrentCar);
   writer.Write(JSON_CAR);
}

当我反序列化时,我需要知道类型,在反序列化之前:

CurrentCar = JsonSerializer.Deserialize<???>(reader.ReadString());

我怎样才能做到这一点?谢谢。

如果您不知道汽车的确切类型,您的 Json 应该包含 属性 保留它的类型

{
  "CarManufacturer" : "FORD"
}

您可以将此 属性 手动添加到您的 class

enum CarManufacturer
{
    FORD,
    BMW
}
class Car
{
    [JsonConverter(typeof(JsonStringEnumConverter))]
    public CarManufacturer Manufacturer { get; set; }
    public string Name { get; set; }
}

class Ford:Car
{
    public Ford()
    {
        Manufacturer = CarManufacturer.FORD;
    }
    public string OnlyFord { get; set; }
}

class BMW :Car
{
    public BMW()
    {
        Manufacturer = CarManufacturer.BMW; ;
    }
    public string OnlyBMW { get; set; }
}

你可以像下面这样序列化它

Car CurrentCar = new Ford { Name = "Foard Car", OnlyFord = "spacific feature in Ford Cars" };
string json = JsonSerializer.Serialize(CurrentCar, CurrentCar.GetType());
Console.WriteLine(json);

反序列化

Car Tempcar = JsonSerializer.Deserialize<Car>(json);
var Car = Tempcar.Manufacturer switch
{
    CarManufacturer.BMW => JsonSerializer.Deserialize<BMW>(json),
    CarManufacturer.FORD => JsonSerializer.Deserialize<Ford>(json),
    _ => Tempcar
};

这应该可以解决您的问题,但它也有一些缺点

  1. 您将为同一个对象进行两次反序列化!
  2. 将一些 属性 添加到您的模型中以用作类型鉴别器
  3. 如果您的基础 class 是抽象 class
  4. ,则此解决方案将不起作用

要克服这个问题,您应该编写 Custom converter Support polymorphic deserialization 这会自动将类型鉴别器添加到生成的 json 而不会向您的 Class

添加任何值