.NET 6 ships with a System.Text.Json source generator as a way to improve your API performance. By default the System.Text.Json serializer is using a lot of reflection behind the scenes. Of course this has a negative impact on startup performance, memory usage and is a problem for assembly trimming.
With the introduction of the System.Text.Json source generator you get a compile-time alternative that can give your API performance a boost. It introduces the following benefits:
- Increased serialization throughput
- Reduced start-up time
- Reduced private memory usage
- Removed runtime use of
System.Reflection
andSystem.Reflection.Emit
- Trim-compatible serialization which reduces application size
Let me walk you through the steps to configure this for your application.
Configure the System.Text.Json source generator
Source generators are a little bit magical. So we have to take some steps to get it working.
Remark: The source generator is part of the 6.0 release of the System.Text.Json NuGet package.
First we need to create an (internal) partial class which derives from JsonSerializerContext.
:
For every type we want to serialize through the source generator, we need to add a JsonSerializableAttribute
on top of this class:
We can further control the serialization process through the JsonSerializerOptionsAttribute
:
Let’s have a look what is generated by the source generator. You can use a decompiler for that or the MSBuild trick mentioned here.
Here are our data contracts:
And here is a part of the generated code:
Whow! That is a lot of code...
Use the generated code with the JsonSerializer
The JsonSerializer introduces some new overloads that allow you to use the generated code:
Or:
Integrate it in your ASP.NET Core application
Of course in your ASP.NET Core application you typically don’t invoke the JsonSerializer
directly and typically just return a model:
In that case how can we use this source generator? We need to call the AddJsonOptions()
on the IServiceCollection
and specify our JsonContext
class on the JsonSerializerOptions
:
So that should be enough to get started with the System.Text.Json source generator.
If you want to learn more, have a look here: https://devblogs.microsoft.com/dotnet/try-the-new-system-text-json-source-generator/