[英]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
};
這應該可以解決您的問題,但它有一些缺點
為了克服這個問題,您應該編寫自定義轉換器支持多態反序列化,這將自動將類型鑒別器添加到生成的 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.