.NET 6新特性试用 | System.Text.Json序列化代码自动生成
生活随笔
收集整理的這篇文章主要介紹了
.NET 6新特性试用 | System.Text.Json序列化代码自动生成
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
幾乎所有.NET序列化程序的實現基礎都是反射。下列代碼是Newtonsoft.Json的實現:
protected?virtual?JsonProperty?CreateProperty(MemberInfo?member,?MemberSerialization?memberSerialization) {JsonProperty?property?=?new?JsonProperty();property.PropertyType?=?ReflectionUtils.GetMemberUnderlyingType(member);property.DeclaringType?=?member.DeclaringType;property.ValueProvider?=?CreateMemberValueProvider(member);property.AttributeProvider?=?new?ReflectionAttributeProvider(member);...... }反射為某些場景提供了強大的功能,但相對于直接編碼,在運行性能上較差,例如Newtonsoft.Json就用緩存進行了優化:
public?virtual?JsonContract?ResolveContract(Type?type) {ValidationUtils.ArgumentNotNull(type,?nameof(type));return?_contractCache.Get(type); }而在.NET 6中,為System.Text.Json提供了Source Generator,可以在編譯時就生成序列化源代碼。
Demo
使用方法非常簡單。
只需實現一個繼承自JsonSerializerContext的類,并聲明JsonSerializable,指定序列化的類型:
[JsonSerializable(typeof(WeatherForecast))] internal?partial?class?WeatherForecastContext?:?JsonSerializerContext { }然后,就可以將自動生成的WeatherForecastContext.Default.WeatherForecast對象作為參數用于序列化:
var?str?=?JsonSerializer.Serialize(new?WeatherForecast {TemperatureC?=?Random.Shared.Next(-20,?55),Summary?=?Summaries[Random.Shared.Next(Summaries.Length)] },?WeatherForecastContext.Default.WeatherForecast);var?obj?=?JsonSerializer.Deserialize(str,?WeatherForecastContext.Default.WeatherForecast);單步跟蹤,可以看到生成的序列化代碼如下,
private?static?void?WeatherForecastSerializeHandler(global::System.Text.Json.Utf8JsonWriter?writer,?global::WebApplication1.WeatherForecast??value) {if?(value?==?null){writer.WriteNullValue();return;}writer.WriteStartObject();writer.WriteNumber(PropName_TemperatureC,?value.TemperatureC);writer.WriteNumber(PropName_TemperatureF,?value.TemperatureF);writer.WriteString(PropName_Summary,?value.Summary);writer.WriteEndObject(); }另外,還可以使用JsonSourceGenerationOptionsAttribute對生成的序列化代碼進行一定調整,比如屬性名大小寫:
[JsonSourceGenerationOptions(PropertyNamingPolicy?=?JsonKnownNamingPolicy.CamelCase)] [JsonSerializable(typeof(WeatherForecast))] internal?partial?class?WeatherForecastContext?:?JsonSerializerContext { }結論
在編譯時生成源代碼可為.NET應用程序帶來許多好處,包括提高性能。官方提供的測試結果表明提高了接近40%,有興趣的朋友可以驗證一下:
如果你覺得這篇文章對你有所啟發,請幫忙點個贊或者在看
總結
以上是生活随笔為你收集整理的.NET 6新特性试用 | System.Text.Json序列化代码自动生成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在 ASP.NET Core 中使用托管
- 下一篇: ASP.NET Web API中实现版本