上一篇聊了如何把复杂的设备通讯拆解成Device、Group、Variable三层配置,这就像是为自动化产线画好了一张蓝图。但蓝图终究是纸上的,产线要跑起来,得有实实在在的设备、分组和变量在程序里"活"过来。今天,来说说如何让这张JSON蓝图变成内存中一个个听话的"对象",以及如何用一个叫Newtonsoft.Json的工具来完成这个过程。
"实体"对象化
Device, Group和Variable在C# 中是以对象的形式创建, 也就是Class, 需要先分析这三个"实体"分别有哪些特征, 然后在Class中将这些特征创建为属性, 属性是C# 中一个关键的概念
❝「属性(Property)是C# 类中用于封装字段的访问器,它通过get和set方法控制数据的读取和写入,让外部代码能以简洁的赋值语法访问对象内部数据,同时保持封装性和可扩展性」
❞
Device作为设备实体, 肯定会包含设备名称, 设备连接状态, 首次连接, 重连次数, 这个Device对象可以看作一个公共对象, 针对具体的一种通信协议的设备会有更具针对性的属性, 比如这里是一个ModbusRtu设备, 它还需要具备如下属性:
串口名称, 波特率, 数据位, 校验位, 停止位, 奇偶校验, 这里会分别创建两个类, 一个是Device基类, 一个是ModbusRtuDevice派生类, 通过继承使ModbusRtuDevice类也具有Device类中的属性
针对Group和Variable也是同样的逻辑, Group先具有一个共用属性的基类, 包含组名称等公共属性, ModbusRtuGroup类具有针对ModbusRtu通信协议的特有属性, 之后通过继承使ModbusRtuGroup类也具有Group类中的属性
针对任何通信协议, 变量的属性总是一致的, 所以不需要单独在创建一个ModbusRtuVariable类, 这里只创建一个Varible类, 为了命名统一也可以创建一个单独的ModbusRtuVariable类, 只不过里面什么也不写, 它继承了Variable类
层级关系
按照12章的内容, Device, Group, Variable被认为划分成了三层结构, 那么在程序中怎么体现这种层级关系
可以注意到, Device类里包含了一个Group对象的列表(List<ModbusRtuGroup>),Group类里又包含了一个Variable对象的列表(List<ModbusRtuVariable>)。这种嵌套关系,完美地对应了层级结构。这就给了后续JSON序列化一张清晰的地图,它知道如何一层层地把JSON数据填充到这些对象里。
JSON序列化
通过Nuget安装Newtonsoft.Json 13.0.4, 需要先创建一个JsonHelper类, 其中包含Json序列化和反序列化的方法
❝Json序列化是把对象保存成文件
Json反序列化是将文件转换为对象
❞
该类提供以下几个静态核心方法
程序结构