.NET 6 的 System.Text.Json 源代码生成在哪里存储其代码?

Where does .NET 6's System.Text.Json source generation store its code?

我已尝试基于 MS Docs: How to use source generation in System.Text.Json 实现基于源代码生成的 JSON 序列化。我的代码如下:

using System;
using System.Text.Json;

var person = new Person(){FirstName = "John", LastName = "Shepard"};
Console.WriteLine(JsonSerializer.Serialize(person));

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

还有我的 SerializationContext:

[JsonSerializable(typeof(Person))]
public partial class PersonJsonContext : JsonSerializerContext
{

}

我的项目中安装了 System.Text.Json 版本 6.0.0。

但是当运行dotnet build时,我的PersonJsonContextclass没有生成代码。在哪里可以找到生成的代码?

A source generator 生成源代码作为中间编译步骤。作为输入,它用选择加入属性注释了你的代码,作为输出,它有 C# 文件,这些文件将被编译到你的最终程序集中。

使用 Visual Studio 2019 版本 16.9 或更高版本,您可以展开项目树依赖项下的分析器部分以查看生成的代码:

您也可以通过打开输出目录来浏览文件,.g.cs 文件默认应该在 obj 目录中。

现在 [JsonSerializable] attribute opt-in for the System.Text.Json serializers 使编译器输出 class 有助于序列化,因此当您第一次序列化或反序列化到某个 [=38 或从某个 class,但将此性能损失卸载到编译阶段。

如果没有代码生成器,System.Text.Json 会在第一次遇到类型时检查序列化元数据的类型,并在应用程序生命周期的剩余时间内缓存它。

如果您应用适当的属性并检查您的输出目录,您实际上在(反)序列化期间使用了上下文,您会注意到它没用

请确保传递适当类型的上下文:

var json = JsonSerializer.Serialize(person, PersonJsonContext.Default.Person);