Skip to main content

Optimize your API performance with the System.Text.Json source generator

.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 and System.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/

Popular posts from this blog

Podman– Command execution failed with exit code 125

After updating WSL on one of the developer machines, Podman failed to work. When we took a look through Podman Desktop, we noticed that Podman had stopped running and returned the following error message: Error: Command execution failed with exit code 125 Here are the steps we tried to fix the issue: We started by running podman info to get some extra details on what could be wrong: >podman info OS: windows/amd64 provider: wsl version: 5.3.1 Cannot connect to Podman. Please verify your connection to the Linux system using `podman system connection list`, or try `podman machine init` and `podman machine start` to manage a new Linux VM Error: unable to connect to Podman socket: failed to connect: dial tcp 127.0.0.1:2655: connectex: No connection could be made because the target machine actively refused it. That makes sense as the podman VM was not running. Let’s check the VM: >podman machine list NAME         ...

Azure DevOps/ GitHub emoji

I’m really bad at remembering emoji’s. So here is cheat sheet with all emoji’s that can be used in tools that support the github emoji markdown markup: All credits go to rcaviers who created this list.

Cleaner switch expressions with pattern matching in C#

Ever find yourself mapping multiple string values to the same result? Being a C# developer for a long time, I sometimes forget that the C# has evolved so I still dare to chain case labels or reach for a dictionary. Of course with pattern matching this is no longer necessary. With pattern matching, you can express things inline, declaratively, and with zero repetition. A small example I was working on a small script that should invoke different actions depending on the environment. As our developers were using different variations for the same environment e.g.  "tst" alongside "test" , "prd" alongside "prod" .  We asked to streamline this a long time ago, but as these things happen, we still see variations in the wild. This brought me to the following code that is a perfect example for pattern matching: The or keyword here is a logical pattern combinator , not a boolean operator. It matches if either of the specified pattern...