包含event事件的C#模型能否序列化为JSON字符串实现深拷贝?
带事件的UI模型通过JSON序列化实现深拷贝的可行性解答
结论
该方案不可行,且不建议在作为UI DataContext的模型场景下使用。
核心原因
- C#中的事件本质是封装了委托的字段,委托存储的是订阅方的运行时对象引用,这类和当前进程内存环境强绑定的内容本身就无法被JSON这类纯数据格式序列化,你遇到的事件无法被序列化是正常的默认行为,不是异常问题。
- 退一步说即使你强行通过自定义逻辑实现了事件的序列化,也会违背深拷贝的核心需求:反序列化得到的克隆对象如果还绑定了原模型的事件订阅,修改克隆对象属性会触发原有UI的更新,完全不符合你要得到独立模型的预期。
落地建议
- 序列化时忽略事件字段即可:常用JSON序列化库(
Newtonsoft.Json、System.Text.Json)默认就不会序列化事件,不用额外调整。 - 反序列化得到的新模型实例如果是要绑定到新UI,直接将新实例作为新UI的DataContext即可,UI会自动订阅对应的变更事件,不需要手动复制原有的事件订阅。
- 如果需要更高效率的深拷贝,推荐用源生成器生成克隆逻辑、或者用AutoMapper这类映射库配置映射规则,一次配置到处可用,性能比序列化反序列化高很多,也不会出现序列化带来的精度丢失、循环引用报错等隐性问题。
内容的提问来源于stack exchange,提问作者Balasubramanian
相关产品推荐
相关产品推荐

