例如,我有幾種型別的汽車被序列化為 .car 檔案(這是一個學校專案)。我有三種不同的型別,福特、雷克薩斯和道奇。我可以很好地保存它們。但是根據我程式的當前架構,當我反序列化時,我需要在反序列化之前知道型別。例如,我是這樣序列化的:
if (CurrentCar.GetType() == typeof(Ford))
{
var JSON_CAR = JsonSerializer.Serialize((Ford)CurrentCar);
writer.Write(JSON_CAR);
}
當我反序列化時,我需要在反序列化之前知道型別:
CurrentCar = JsonSerializer.Deserialize<???>(reader.ReadString());
我怎樣才能做到這一點?謝謝你。
uj5u.com熱心網友回復:
如果您不知道汽車的確切型別,則您的 Json 應包含屬性保持其型別
{
"CarManufacturer" : "FORD"
}
您可以手動將此屬性添加到您的課程中
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 中,而無需向您的類添加任何值
uj5u.com熱心網友回復:
像這樣的東西?
public T GetObjectDeserialized<T>(string mydata) {
return JsonSerializer.Serialize<T>(mydata);
}
進而:
CurrentCar mycar = GetObjectDeserialized<CurrentCar.GetType()>(reader.ReadString());
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/367350.html
標籤:C# json 连载 json-反序列化 json序列化
下一篇:如何從mongodbgrep值
