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

DevToys–A swiss army knife for developers

As a developer there are a lot of small tasks you need to do as part of your coding, debugging and testing activities.  DevToys is an offline windows app that tries to help you with these tasks. Instead of using different websites you get a fully offline experience offering help for a large list of tasks. Many tools are available. Here is the current list: Converters JSON <> YAML Timestamp Number Base Cron Parser Encoders / Decoders HTML URL Base64 Text & Image GZip JWT Decoder Formatters JSON SQL XML Generators Hash (MD5, SHA1, SHA256, SHA512) UUID 1 and 4 Lorem Ipsum Checksum Text Escape / Unescape Inspector & Case Converter Regex Tester Text Comparer XML Validator Markdown Preview Graphic Color B

Help! I accidently enabled HSTS–on localhost

I ran into an issue after accidently enabling HSTS for a website on localhost. This was not an issue for the original website that was running in IIS and had a certificate configured. But when I tried to run an Angular app a little bit later on http://localhost:4200 the browser redirected me immediately to https://localhost . Whoops! That was not what I wanted in this case. To fix it, you need to go the network settings of your browser, there are available at: chrome://net-internals/#hsts edge://net-internals/#hsts brave://net-internals/#hsts Enter ‘localhost’ in the domain textbox under the Delete domain security policies section and hit Delete . That should do the trick…

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.