C# Json序列化与反序列化的更高效优雅实现方案咨询
优化实现方案
// 仅需一次反序列化即可拿到完整Configuration对象 var config = JsonConvert.DeserializeObject<Configuration>(source.ConfigData); // 提前转为List避免IEnumerable多次枚举,同时做空值防护 var ipList = config?.IpAddresses?.ToList() ?? new List<IpAddress>(); foreach (var ipDetail in ipList) { // 注意这里原代码的StartIpAddress/EndIpAddress要和类定义的Start/End属性名对应 if (!string.IsNullOrEmpty(ipDetail.Start) && !string.IsNullOrEmpty(ipDetail.End)) { if (bla == blabla) // 原有校验逻辑保持不变 { ipDetail.IsValid = true; ipDetail.IPFamily = IPAddressFamily.IPV4; } } } // 直接序列化修改后的config即可,无需额外赋值IpAddresses source.ConfigData = JsonConvert.SerializeObject(config); return source;
核心优化点
- 移除重复反序列化操作:原代码先后两次反序列化
source.ConfigData,优化后仅执行1次反序列化,大幅减少JSON解析的CPU开销,数据量越大收益越明显 - 去掉冗余代码:删除了无意义的
new Configuration()创建操作,该对象会立即被反序列化结果覆盖,没有实际作用 - 修复多次枚举风险:将
IEnumerable<IpAddress>提前转为List,避免Any()+foreach两次枚举延迟执行的IEnumerable可能带来的重复计算、数据不一致问题 - 代码逻辑更紧凑:校验修改和序列化操作复用同一个Configuration对象,无需额外中转
storedIPAddresses变量,可读性更高
注意:原代码中访问的
ipDetail.StartIpAddress、ipDetail.EndIpAddress和你定义的IpAddress类属性名Start、End不一致,需要修正属性名否则会触发空引用异常。
内容的提问来源于stack exchange,提问作者user2948533
相关产品推荐
相关产品推荐

