MAUI iOS真机Newtonsoft.Json序列化JIT编译异常求助
问题成因
iOS真机运行时采用**AOT(提前编译)**模式,不允许运行时进行JIT编译。Newtonsoft.Json默认使用ExpressionValueProvider,它会通过表达式树动态生成访问属性的委托,这个过程需要JIT编译,因此在iOS真机上触发了ExecutionEngineException。而iOS模拟器支持JIT,安卓的AOT实现机制不同,所以这两个环境下可以正常运行。
解决方案
方案1:禁用Newtonsoft.Json的表达式树值提供器
修改序列化配置,强制使用反射访问属性,避免运行时JIT编译:
string result = JsonConvert.SerializeObject(myClass, Formatting.None, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto, // 禁用表达式树值提供器,改用反射 ExpressionValueProvider = false });
这是最直接的修复方式,无需修改类结构,仅调整序列化配置即可生效。
方案2:为属性添加显式JsonProperty配置(可选)
如果方案1无效,可显式为接口和实现类的属性配置序列化映射,减少动态解析需求:
interface IMyClass { [JsonProperty("Date")] DateTime Date { get; set; } } class MyClass : IMyClass { [JsonProperty("Date")] public DateTime Date { get; set; } = DateTime.Now; }
方案3:迁移至System.Text.Json
MAUI官方对System.Text.Json的AOT支持更完善,若项目对Newtonsoft.Json的特性依赖不高,可考虑迁移。示例代码:
using System.Text.Json; using System.Text.Json.Serialization; // 配置多态类型处理(对应Newtonsoft的TypeNameHandling.Auto) var options = new JsonSerializerOptions { TypeInfoResolver = new DefaultJsonTypeInfoResolver { Modifiers = { typeInfo => { if (typeInfo.Type == typeof(IMyClass)) { typeInfo.PolymorphismOptions = new JsonPolymorphismOptions { TypeDiscriminatorPropertyName = "$type", DerivedTypes = { new JsonDerivedType(typeof(MyClass), nameof(MyClass)) } }; } }} } }; string result = JsonSerializer.Serialize(myClass, options);
内容的提问来源于stack exchange,提问作者kush
相关产品推荐
相关产品推荐

