.NET 6 的 System.Text.Json 源代码生成不起作用
Posted
技术标签:
【中文标题】.NET 6 的 System.Text.Json 源代码生成不起作用【英文标题】:Where does .NET 6's System.Text.Json source generation store its code? 【发布时间】:2021-12-27 16:52:30 【问题描述】:我已经尝试实现基于源生成的 JSON 序列化,基于这篇文章:
https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-source-generation?pivots=dotnet-6-0
我的代码如下:
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
类中没有生成代码。我不明白为什么。
有什么线索吗?
【问题讨论】:
“我的 PersonJsonContext 类中没有生成代码” - 它不会在源文件中生成 code,它会在您的程序集中生成序列化类. 好吧,我明白了,我很困惑,因为我看了一个视频,其中那个家伙有一个 .g.cs 文件,其中包含所有生成的代码。因此,如果我理解得很好,在我当前的代码中,有效地使用了基于源生成的序列化吗? 是的,中间步骤是一个 .g.cs 文件,但这不会覆盖您的源文件或添加到它们。部分的另一半(在那个 .g.cs 文件中)将被编译到您的程序集中。然后,您可以像在教程中一样使用它。 好的,但是 .g.cs 文件没有出现在我的文件系统中是否正常?编译后是否清除?如何验证我的序列化是否有效地使用了源代码? 【参考方案1】:source generator 在中间编译步骤中生成源代码。作为输入,您的代码使用选择加入属性进行注释,作为输出,它具有 C# 文件,这些文件将被编译到您的最终程序集中。
您还不能从 Visual Studio 轻松检查或调试生成的源代码。您可以通过打开输出目录来浏览文件,.g.cs
文件默认应该在obj
目录中。
现在[JsonSerializable]
attribute opt-in for the System.Text.Json
serializers 使编译器输出类有助于序列化,因此当您第一次对某个类进行序列化或反序列化时不会对性能造成影响,而是将这种性能影响转移到编译阶段。
如果没有代码生成器,System.Text.Json 会在第一次遇到类型时检查该类型的序列化元数据,并在应用程序生命周期的剩余时间内对其进行缓存。
如果您应用适当的属性并检查您的输出目录,并且您实际上在(反)序列化期间使用了上下文,您会注意到它何时没有工作。
只需确保传递适当类型的上下文即可:
var json = JsonSerializer.Serialize(person, PersonJsonContext.Default.Person);
【讨论】:
以上是关于.NET 6 的 System.Text.Json 源代码生成不起作用的主要内容,如果未能解决你的问题,请参考以下文章
.NET 6 中 System.Text.Json 的新特性
.NET 6 新特性 System.Text.Json 中的 Writeable DOM
.NET 6新特性试用 | System.Text.Json序列化代码自动生成
json.net 到 System.text.json 对 .net 5 中嵌套类的期望