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。在哪里可以找到生成的代码?
源代码生成器生成源代码作为中间编译步骤。作为输入,它使用可选属性注释您的代码;作为输出,它具有将编译到最终程序集中的 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)