You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 23:33:23