当前位置: 首页 > news >正文

基于C#的工业测控软件-依赖库

目录

简介

设计特点

实战案例

JSON 序列化封装

内存序列化

文件序列化

使用例子

使用案例

总结


简介

采用依赖抽象与实现分离的设计模式,核心是对第三方库进行封装与适配。

设计特点

接口隔离:每个模块都以 Impl 结尾的文件作为具体实现,上层业务只需依赖抽象接口,不直接依赖第三方库。

可替换性:如果未来需要更换 JSON / 日志 / YAML 库(比如从 Newtonsoft.Json 切换到 System.Text.Json),只需替换 Impl 实现,无需修改业务代码。

依赖管理:每个模块都有独立的 依赖项 节点,便于版本控制和冲突排查。

文件 / 内存双模式:NewtonJson 和 YamlDotNet 都提供了文件操作与内存操作两种实现,适配不同场景需求。

实战案例

JSON 序列化封装

  • NewtonJsonImpl.cs(内存操作实现)
    • Serialize(object): string:将对象序列化为 JSON 字符串
    • Deserialize(string): T:将 JSON 字符串反序列化为指定类型对象
public interface ICxJson { /// <summary> /// 对象序列化为 JSON 字符串 /// </summary> string Serialize(object obj); /// <summary> /// JSON 字符串反序列化为对象 /// </summary> T Deserialize<T>(string json) where T : class; }

内存序列化

using Newtonsoft.Json; using Newtonsoft.Json.Converters; public class NewtonJsonImpl : ICxJson { // 全局复用序列化器,提升性能 private static readonly JsonSerializer _serializer; static NewtonJsonImpl() { _serializer = new JsonSerializer { // 格式化缩进 Formatting = Formatting.Indented, // 忽略空值 NullValueHandling = NullValueHandling.Ignore }; // 枚举 → 字符串 _serializer.Converters.Add(new StringEnumConverter()); } public string Serialize(object obj) { if (obj == null) throw new ArgumentNullException(nameof(obj)); using var sw = new StringWriter(); _serializer.Serialize(sw, obj); return sw.ToString(); } public T Deserialize<T>(string json) where T : class { if (string.IsNullOrWhiteSpace(json)) throw new ArgumentException("JSON 字符串不能为空"); using var sr = new StringReader(json); return _serializer.Deserialize(sr, typeof(T)) as T; } }

文件序列化

using Newtonsoft.Json; using Newtonsoft.Json.Converters; public class NewtonJsonFileImpl : ICxJsonFile { private static readonly JsonSerializer _serializer; static NewtonJsonFileImpl() { _serializer = new JsonSerializer { Formatting = Formatting.Indented, NullValueHandling = NullValueHandling.Ignore }; _serializer.Converters.Add(new StringEnumConverter()); } public void Serialize(object obj, string filePath) { if (obj == null) throw new ArgumentNullException(nameof(obj)); if (string.IsNullOrWhiteSpace(filePath)) throw new ArgumentException("文件路径不能为空"); try { using var fs = File.CreateText(filePath); _serializer.Serialize(fs, obj); } catch (Exception ex) { throw new InvalidOperationException($"JSON 写入文件失败:{filePath}", ex); } } public T Deserialize<T>(string filePath) where T : class { if (string.IsNullOrWhiteSpace(filePath)) throw new ArgumentException("文件路径不能为空"); if (!File.Exists(filePath)) throw new FileNotFoundException("文件不存在", filePath); try { using var fs = File.OpenText(filePath); return _serializer.Deserialize(fs, typeof(T)) as T; } catch (Exception ex) { throw new InvalidOperationException($"JSON 读取文件失败:{filePath}", ex); } } }

使用例子

// 1. 内存操作 ICxJson json = new NewtonJsonImpl(); string jsonStr = json.Serialize(new User { Id = 1, Name = "张三" }); User user = json.Deserialize<User>(jsonStr); // 2. 文件操作 ICxJsonFile jsonFile = new NewtonJsonFileImpl(); jsonFile.Serialize(user, "user.json"); User userFromFile = jsonFile.Deserialize<User>("user.json"); public class User { public int Id { get; set; } public string Name { get; set; } }

NewtonJsonFileImpl.cs((文件操作实现)

  • Serialize(object, string): void:将对象序列化为 JSON 并写入指定文件
  • Deserialize(string): T:从指定文件读取 JSON 并反序列化为指定类型对象

使用案例

using System; using System.IO; using CxBaseSupply; using Newtonsoft.Json; using Newtonsoft.Json.Converters; namespace CxDepends { /// <summary> /// Newtonsoft.Json 文件操作实现类 /// 实现 ICxJsonFile 接口:对象 ↔ JSON 文件 /// </summary> public class NewtonJsonFileImpl : ICxJsonFile { /// <summary> /// 静态全局序列化器(全局复用,提升性能) /// </summary> private static readonly JsonSerializer _jsonSerializer; /// <summary> /// 静态构造:一次性配置序列化规则 /// </summary> static NewtonJsonFileImpl() { _jsonSerializer = new JsonSerializer(); // 枚举 → 字符串(不转数字) _jsonSerializer.Converters.Add(new StringEnumConverter()); // 格式化缩进(文件可读性更强) _jsonSerializer.Formatting = Formatting.Indented; // 忽略空值属性 _jsonSerializer.NullValueHandling = NullValueHandling.Ignore; } /// <summary> /// 将对象序列化为 JSON 并写入文件 /// </summary> /// <param name="obj">要序列化的对象</param> /// <param name="file">文件路径</param> public void Serialize(object obj, string file) { // 参数校验 if (obj == null) throw new ArgumentNullException(nameof(obj), "序列化对象不能为空"); if (string.IsNullOrWhiteSpace(file)) throw new ArgumentException("文件路径不能为空", nameof(file)); try { // 创建文件流,using 自动释放 using (StreamWriter sw = File.CreateText(file)) { _jsonSerializer.Serialize(sw, obj); } } catch (Exception ex) { throw new InvalidOperationException($"JSON 写入文件失败:{file}", ex); } } /// <summary> /// 从文件读取 JSON 并反序列化为对象 /// </summary> /// <typeparam name="T">目标类型</typeparam> /// <param name="file">文件路径</param> /// <returns>强类型对象</returns> public T Deserialize<T>(string file) where T : class { // 参数校验 if (string.IsNullOrWhiteSpace(file)) throw new ArgumentException("文件路径不能为空", nameof(file)); if (!File.Exists(file)) throw new FileNotFoundException("JSON 文件不存在", file); try { using (StreamReader sr = File.OpenText(file)) { return _jsonSerializer.Deserialize(sr, typeof(T)) as T; } } catch (Exception ex) { throw new InvalidOperationException($"JSON 反序列化失败:{file}", ex); } } } }

总结

一句话记住所有依赖作用

  • Newtonsoft.Json = 操作 JSON
  • Serilog = 记录日志
  • YamlDotNet = 操作 YAML
http://www.jsqmd.com/news/536732/

相关文章:

  • VSCode + Clang-Format 真·无缝集成指南:不止是保存时格式化
  • 5个核心优势:为什么Graphiti是下一代AI代理的时态感知知识图框架
  • SGLang-v0.5.6问题解决:部署常见错误排查,小白避坑指南
  • Mind+掌控板实战:5分钟搞定智慧农场光线监控(含SIoT配置避坑指南)
  • Qt布局进阶:除了跨行跨列,QGridLayout里还有这些隐藏技巧和坑
  • 百川2-13B-4bits模型显存监控:OpenClaw长时间运行资源预警
  • 2026 企业 AI 赛道深度观察:三大厂商的落地竞速与格局分化
  • 程序员视角下的范畴论:从数学抽象到代码实践的思维跃迁
  • OpenClaw调试技巧:nanobot任务执行失败的5种排查方法
  • 3大核心技术解密:AnyLoc如何实现革命性的通用视觉定位系统
  • Phi-4-Reasoning-Vision自主部署:无需申请API密钥的本地化多模态推理平台
  • HarmonyOS 6实战:PdfView编辑保存与实时更新技术
  • STM32+Su-03T语音模块实战:空气质量检测与语音播报全流程(附完整代码)
  • 深度解析Ultralytics YOLO:从目标检测到企业级应用的完整实战指南
  • 别再傻傻分不清了!TOD、GPRMC、IRIG-B三种时间同步协议,到底该用哪个?
  • ChatGPT Edu实战指南:如何构建高效的教育对话系统
  • 2026年靠谱的异形铝合金凉亭直销厂家推荐 - 品牌宣传支持者
  • 自动化周报生成:OpenClaw+GLM-4.7-Flash整合多源数据
  • CMOS图像传感器时间暗噪声抑制技术:原理与策略
  • 从STP到MSTP:为什么你的企业网络需要升级生成树协议?(思科设备实测对比)
  • XposedHider深度解析:突破Xposed框架检测的全方位解决方案
  • 不锈钢水管及管件选购指南:不锈钢水管哪家好/不锈钢水管厂家/不锈钢水管公司/不锈钢水管/选择指南 - 优质品牌商家
  • 视觉毕设新手入门:从选题到部署的全链路技术实践指南
  • Flink—Sql接口
  • 百川2-13B-4bits量化模型性能实测:OpenClaw长任务稳定性报告
  • 构建高可用AI+RAG智能客服应用:从架构设计到生产环境实战
  • 17、LangChain 前端:简介
  • 终极解决:Compose Multiplatform 跨平台应用字体配置全流程指南
  • 开源贡献指南:为OpenClaw开发Qwen3.5-9B适配插件
  • QMCDecode终极指南:3步解锁QQ音乐加密文件,实现跨平台音乐自由