簡體   English   中英

在反序列化 C# 之前,是否有辦法檢查 object 的 class 類型?

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

因此,例如,我有幾種類型的汽車被序列化為 a.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. 您將對相同的 object 進行兩次反序列化!
  2. 向模型添加一些屬性以用作類型鑒別器
  3. 如果您的基礎 class 是抽象 class,則此解決方案將不起作用

為了克服這個問題,您應該編寫自定義轉換器支持多態反序列化,這將自動將類型鑒別器添加到生成的 json 中,而不向您的 Class 添加任何值

像這樣的東西?

public T GetObjectDeserialized<T>(string mydata) {
         return JsonSerializer.Serialize<T>(mydata);
}

接着:

CurrentCar mycar = GetObjectDeserialized<CurrentCar.GetType()>(reader.ReadString());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM