Con*_*nor 3 c# serialization json json-deserialization json-serialization
例如,我有几种类型的汽车正在序列化为 .car 文件(这是一个学校项目)。我有三种不同的车型:福特、雷克萨斯和道奇。我可以很好地拯救他们。但是根据我的程序的当前架构,当我反序列化时,我需要在反序列化之前知道类型。例如我这样序列化:
if (CurrentCar.GetType() == typeof(Ford))
{
var JSON_CAR = JsonSerializer.Serialize((Ford)CurrentCar);
writer.Write(JSON_CAR);
}
Run Code Online (Sandbox Code Playgroud)
当我反序列化时,我需要在反序列化之前知道类型:
CurrentCar = JsonSerializer.Deserialize<???>(reader.ReadString());
Run Code Online (Sandbox Code Playgroud)
我怎样才能实现这个目标?谢谢。
现在最新、最好的 .NET 7 提供了对多态序列化和反序列化的全面支持。
您只需要为基类添加一些元数据就可以了
[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; }
}
Run Code Online (Sandbox Code Playgroud)
Car CurrentCar = new Ford { Name = "Foard Car", OnlyFord = "spacific feature in Ford Cars" };
string json = JsonSerializer.Serialize(CurrentCar);
Console.WriteLine(json);
Run Code Online (Sandbox Code Playgroud)
这将生成以下 json
{"$CarManufacturer":"Ford","OnlyFord":"spacific feature in Ford Cars","Name":"Foard Car"}
Run Code Online (Sandbox Code Playgroud)
var car = JsonSerializer.Deserialize<Car>(json);
Console.WriteLine(car is Ford); // true
Run Code Online (Sandbox Code Playgroud)
如果您不知道汽车的确切类型,您的 Json 应该包含保存其类型的属性
var car = JsonSerializer.Deserialize<Car>(json);
Console.WriteLine(car is Ford); // true
Run Code Online (Sandbox Code Playgroud)
您可以将此属性手动添加到您的类中
{
"CarManufacturer" : "FORD"
}
Run Code Online (Sandbox Code Playgroud)
你可以将其序列化如下
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; }
}
Run Code Online (Sandbox Code Playgroud)
反序列化
Car CurrentCar = new Ford { Name = "Foard Car", OnlyFord = "spacific feature in Ford Cars" };
string json = JsonSerializer.Serialize(CurrentCar, CurrentCar.GetType());
Console.WriteLine(json);
Run Code Online (Sandbox Code Playgroud)
这应该可以解决您的问题,但它有一些缺点
为了克服这个问题,你应该编写自定义转换器支持多态反序列化,这会自动将类型鉴别器添加到生成的json中,而不向你的类添加任何值
| 归档时间: |
|
| 查看次数: |
1612 次 |
| 最近记录: |