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

ASP.NET中System.Action序列化反序列化异常问题求助

问题解决:System.NotSupportedException 序列化Action实例失败

问题根源

异常提示无法序列化System.Action实例,路径$.MoveNextAction说明你要序列化的data对象中包含了委托类型(如Action、Func)的成员,或是data本身是异步状态机相关对象(比如未完成的异步任务实例)——这类对象内部会包含MoveNextAction字段,而Newtonsoft.Json默认不支持序列化委托类型。

注意:异常实际发生在JsonConvert.SerializeObject(data)步骤,只是因为异步代码的特性,异常在调用PostAsync时才显现出来。

解决方案

1. 忽略不需要序列化的委托成员

在data对应的类中,给所有委托类型的字段/属性加上[JsonIgnore]特性,序列化时会自动跳过这些成员:

public class DataModel
{
    // 正常序列化的数据字段
    public string RequestId { get; set; }
    public Dictionary<string, string> Params { get; set; }

    // 标记为忽略序列化的Action成员
    [JsonIgnore]
    public Action Callback { get; set; }
}

2. 替换委托为可序列化的标识

如果需要传递委托对应的逻辑信息,不要直接序列化委托,而是用字符串、枚举等可序列化类型标识逻辑类型,后续在服务端反序列化后再重新绑定逻辑:

public class DataModel
{
    public string RequestId { get; set; }
    // 用字符串标识要执行的逻辑类型
    public string LogicType { get; set; } = "AfterProcess";

    // 反序列化后绑定委托
    [JsonIgnore]
    public Action ProcessCallback { get; set; }

    [OnDeserialized]
    private void InitCallback(StreamingContext context)
    {
        if (LogicType == "AfterProcess")
        {
            ProcessCallback = () => { /* 执行对应逻辑 */ };
        }
    }
}

3. 封装纯数据DTO对象

如果data是包含异步状态或其他复杂逻辑的对象(比如异步任务、包含事件的实例),建议提取其中需要传递的纯数据字段,单独定义一个DTO(数据传输对象)类,只序列化这个DTO:

// 只包含需要传输的数据字段的DTO类
public class RequestDataDto
{
    public string RequestId { get; set; }
    public int Value { get; set; }
}

// 使用时提取数据到DTO再序列化
var dto = new RequestDataDto
{
    RequestId = data.RequestId,
    Value = data.Value
};
var json = JsonConvert.SerializeObject(dto);

内容的提问来源于stack exchange,提问作者voryba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 06:21:57