本文接着上一篇补充几个问题
1 序列化派生类的属性
不支持多态类型层次结构的序列化。 例如,如果属性定义为接口或抽象类,则即使运行时类型具有其他属性,也只会序列化对接口或抽象类定义的属性。 此部分中介绍了此行为的例外情况。
例如,假设有一个 WeatherForecast
类和一个派生类 WeatherForecastDerived
:
public class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string Summary { get; set; }
}
public class WeatherForecastDerived : WeatherForecast
{
public int WindSpeed { get; set; }
}
并且假设 Serialize
方法的类型参数在编译时为 WeatherForecast
:
var options = new JsonSerializerOptions
{
WriteIndented = true
};
jsonString = JsonSerializer.Serialize<WeatherForecast>(weatherForecast, options);
在这种情况下,即使 weatherForecast
对象实际上是 WeatherForecastDerived
对象,也不会序列化 WindSpeed
属性。 仅序列化基类属性:
{
"Date": "2019-08-01T00:00:00-07:00",
"TemperatureCelsius": 25,
"Summary": "Hot"
}
此行为旨在帮助防止在运行时创建的派生类型中发生意外数据泄露。
若要序列化前面示例中派生类型的属性,请使用以下方法之一:
options = new JsonSerializerOptions
{
WriteIndented = true
};
jsonString = JsonSerializer.Serialize(weatherForecast, weatherForecast.GetType(), options);
将要序列化的对象声明为 object
。
options = new JsonSerializerOptions
{
WriteIndented = true
};
jsonString = JsonSerializer.Serialize<object>(weatherForecast, options);
在前面的示例方案中,这两种方法都会使 WindSpeed
属性包含在 JSON 输出中:
{
"WindSpeed": 35,
"Date": "2019-08-01T00:00:00-07:00",
"TemperatureCelsius": 25,
"Summary": "Hot"
}
更多详情请看官网