今天又重新玩了一次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