关于.NET9 NativeAOT JSON的序列化与反序列化

时间:2025-03-27 18:53   作者:ChenReal    阅读:18

今天又重新玩了一次NativeAOT,与之前不同的是,我的开发环境升级到最新的.NET9.0。

用NativeAOT编译发布一个小工具,套路跟.NET8差不多,这里就不赘述了。过程看似顺利,编译完成并且也拿到执行文件。

但运行却报错了,是System.Text.Json反序列化的报错。Oh,差点忘了!NativeAot会裁剪代码后,System.Text.Json那些Emit的操作全都不work了。

记得咱以前有个解决方案:配置一个rd.xml文件做声明,不对Json库进行裁剪。

<Directives>
 <Application>
  <Assembly Name="System.Text.Json"  Dynamic="Required All">
  </Assembly>
 </Application>
</Directives>

但是,这样做的代价是,打包出来的执行文件size会大幅增加。

现在都2025年了,.NET都上9.0了,微软也应该能有更加好的办法,给我们解决这个问题了吧。抱着一丝希望,在网上搜索了一下。果然,还真有!

利用SourceGenerator,来生成对象序列化&反序列化的静态代码。就能完美解决所有问题了!

  • 假设我们有一个叫Mission的类需要进行序列化和反序列化
	public class Mission
	{
		public bool status
		{
			get;
			set;
		}

		public MissionData data
		{
			get;
			set;
		}
	}
  • 只要声明一个继承JsonSerializerContext的类,并且挂上JsonSerializable的Attribute与上面的Mission类关联起来
[JsonSerializable(typeof(Mission))]
internal partial class MissionGenerationContext : JsonSerializerContext
{
}
  • 最后,我们就可以愉快地写下Json序列化/反序列化的代码了
var mission = JsonSerializer.Deserialize(jsonStr,typeof(Mission), MissionGenerationContext.Default)  as MissionResp;

jsonStr = JsonSerializer.Serialize(mission, MissionGenerationContext.Default.Mission);

如果暂时没看明白也没关系,微软官方文档介绍的很详细:

https://learn.microsoft.com/zh-cn/dotnet/standard/serialization/system-text-json/source-generation

 

评论
0/200