.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
时,我的PersonJsonContext
class没有生成代码。在哪里可以找到生成的代码?
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);
我已尝试基于 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
时,我的PersonJsonContext
class没有生成代码。在哪里可以找到生成的代码?
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);