.NET 8 Blazor Web App启用AOT时JsonSerializer抛出异常
解决Blazor WebAssembly AOT模式下JsonSerializer反射序列化禁用异常
当Blazor WebAssembly项目启用AOT后,.NET 8会默认禁用基于反射的JSON序列化——不管是Release还是调试模式,这就是你遇到异常的原因。下面提供两种可行的解决方法:
方法1:使用System.Text.Json源生成器(推荐)
源生成器是AOT友好的方案,它在编译时生成序列化代码,完全避免反射。
- 创建一个Json序列化上下文类,指定你需要序列化的类型:
using System.Text.Json.Serialization; namespace YourProjectNamespace; // 这里添加你需要序列化的所有类型,比如string、自定义实体类等 [JsonSerializable(typeof(string))] public partial class AppJsonSerializerContext : JsonSerializerContext { }
- 在需要序列化的地方,使用这个上下文来执行操作:
@code{ protected override void OnInitialized() { var test = System.Text.Json.JsonSerializer.Serialize( "Hello World", AppJsonSerializerContext.Default.String ); } }
方法2:显式配置TypeInfoResolver
如果你暂时不想用源生成器,可以显式配置JsonSerializerOptions.TypeInfoResolver,允许使用反射序列化(注意:此方法在AOT下可能有性能损耗,且需要确保所有要序列化的类型都能被正确处理):
@code{ protected override void OnInitialized() { var options = new System.Text.Json.JsonSerializerOptions { TypeInfoResolver = new System.Text.Json.Serialization.Metadata.DefaultJsonTypeInfoResolver() }; var test = System.Text.Json.JsonSerializer.Serialize("Hello World", options); } }
补充说明
.NET 8对Blazor WASM的AOT模式做了调整,调试模式下也默认禁用了反射序列化,以此对齐Release模式的行为,确保开发阶段就能提前发现AOT兼容性问题,避免发布后出现意外。
内容的提问来源于stack exchange,提问作者Steffan Pallesen
相关产品推荐
相关产品推荐

