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

为什么ReactiveUI中的ReactiveObject无法被Newtonsoft.Json正常序列化

问题原因
  • 核心原因是ReactiveObject基类本身标记了[DataContract]特性,Newtonsoft.Json默认对标记了[DataContract]的类,只会序列化显式标记了[DataMember]或[JsonProperty]的属性,你代码中用[Reactive]标记的属性没有加序列化相关特性,所以会被直接忽略,最终输出的JSON对应属性值为null。
解决方案

方案1:显式标记序列化特性

给所有需要序列化的[Reactive]属性添加[JsonProperty]或[DataMember]特性即可,示例代码:

[Reactive, JsonProperty] public ModelParameter Model { get; set; }
[Reactive, JsonProperty] public VisualParameters VisualParameters { get; set; }
// 其余属性同理添加

该方案适配性强,不需要修改全局配置,适合只需要序列化少数ReactiveObject子类的场景。

方案2:修改Newtonsoft.Json全局配置

调整全局序列化配置,忽略[DataContract]等序列化契约的约束,不需要修改业务类代码,示例配置:

private static void SetGlobalSettings()
{
    var temp = new JsonSerializerSettings
    {
        Converters = new List<JsonConverter>
        {
            new StringEnumConverter()
        },
        Formatting = Formatting.Indented,
        ObjectCreationHandling = ObjectCreationHandling.Replace,
        TypeNameHandling = TypeNameHandling.Auto,
        TypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Simple,
        // 新增下面的配置
        ContractResolver = new DefaultContractResolver
        {
            IgnoreSerializableAttribute = true,
            IgnoreSerializableInterface = true
        }
    };
    JsonConvert.DefaultSettings = () => temp;
}

该方案适合项目中有大量ReactiveObject子类需要序列化的场景,不需要逐个修改属性。

额外注意点

如果后续需要反序列化ReactiveObject对象,建议保留ObjectCreationHandling.Replace配置,避免反序列化时触发属性变更通知导致的多余业务逻辑执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:48:01