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

Omb*_*lin 6 .net c# system.text.json sourcegenerators

我尝试根据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; }
}
Run Code Online (Sandbox Code Playgroud)

和我的 SerializationContext:

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

}
Run Code Online (Sandbox Code Playgroud)

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

但是运行时dotnet build,我的类中没有生成任何代码PersonJsonContext。在哪里可以找到生成的代码?

Cod*_*ter 8

代码生成器生成源代码作为中间编译步骤。作为输入,它使用可选属性注释您的代码;作为输出,它具有将编译到最终程序集中的 C# 文件。

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

您还可以通过打开输出目录来浏览文件,默认情况下.g.cs文件应位于该目录中。obj

现在,序列化器[JsonSerializable]的属性选择System.Text.Json使编译器输出有助于序列化的类,因此当您首次序列化或反序列化到某个类或从某个类反序列化时,不会受到性能影响,而是将此性能影响转移到编译阶段。

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

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

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

var json = JsonSerializer.Serialize(person, PersonJsonContext.Default.Person);
Run Code Online (Sandbox Code Playgroud)