gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:51:56 24 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

更新 .NET 7

现在最新最好的 .NET 7 提供了对 polymorphic serialization and deserialization 的全面支持.

你只需要为基类添加一些元数据就可以了

[JsonPolymorphic(TypeDiscriminatorPropertyName = "$CarManufacturer")]
[JsonDerivedType(typeof(Ford), "Ford")]
[JsonDerivedType(typeof(BMW),"BMW")]
class Car
{
public string Name { get; set; }
}

class Ford : Car
{
public string OnlyFord { get; set; }
}

class BMW : Car
{
public string OnlyBMW { get; set; }
}

序列化

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

这将生成以下 json

{"$CarManufacturer":"Ford","OnlyFord":"spacific feature in Ford Cars","Name":"Foard Car"}

反序列化

var car = JsonSerializer.Deserialize<Car>(json);
Console.WriteLine(car is Ford); // true

旧答案(.NET 6 或更早版本)

如果您不知道汽车的确切类型,您的 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
};

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

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

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

关于c# - 无论如何在 C# 中反序列化之前检查对象的类类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70131335/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com