无论如何在 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
};
这应该可以解决您的问题,但它也有一些缺点
- 您将为同一个对象进行两次反序列化!
- 将一些 属性 添加到您的模型中以用作类型鉴别器
- 如果您的基础 class 是抽象 class
,则此解决方案将不起作用
要克服这个问题,您应该编写 Custom converter Support polymorphic deserialization 这会自动将类型鉴别器添加到生成的 json 而不会向您的 Class
添加任何值
例如,我有几种类型的汽车被序列化为 .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
};
这应该可以解决您的问题,但它也有一些缺点
- 您将为同一个对象进行两次反序列化!
- 将一些 属性 添加到您的模型中以用作类型鉴别器
- 如果您的基础 class 是抽象 class ,则此解决方案将不起作用
要克服这个问题,您应该编写 Custom converter Support polymorphic deserialization 这会自动将类型鉴别器添加到生成的 json 而不会向您的 Class
添加任何值