0

根据这篇文章,我尝试实现基于源生成的 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我不明白为什么。

有什么线索吗?

4

1 回答 1

2

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

您还不能从 Visual Studio 轻松检查或调试生成的源代码。您可以通过打开输出目录来浏览文件,默认情况下.g.cs文件应该在目录中。obj

现在,序列化程序的属性[JsonSerializable]选择System.Text.Json使编译器输出有助于序列化的类,因此当您第一次对某个类进行序列化或反序列化时不会对性能造成影响,而是将这种性能影响转移到编译阶段.

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

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

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

var json = JsonSerializer.Serialize(person, PersonJsonContext.Default.Person);
于 2021-11-16T15:54:48.563 回答