C# 配置文件的最终解决方案, yaml的序列化,反序列化
首先安装包:
该包提供的yaml的序列化,和反序列化功能。
新建一个cs文件管理你的配置数据结构如:
public class SeriaInfo
{
// Com 端口
public string port { get; set; } = "";
//波特率
public string baudRate { get; set; } = "无(None)";
//奇偶校验位
public int parity { get; set; } = 0;
//数据位
public int dataBits { get; set; } = 8;
//停止位
public int stopBits { get; set; } = 1;
//字节编码
public int encoding { get; set; } = 0;
}
public class ModbusInfo
{
l public string ip { get; set; } = "192.168.1.199";
public int port { get; set; } = 502;
public int slave_addr { get; set; } = 1;
public ushort start_addr { get; set; } = 8010;
//表示数据完成传输
public ushort done_addr { get; set; } = 8000;
}
//-------------主信息类
public class ConfigInfos
{
public List<SeriaInfo> list_seriaInfo { get; set; } = new List<SeriaInfo>();
public ModbusInfo modbusInfo { get; set; } = new ModbusInfo();
}
有了这个类对象,序列化出来的yaml文件,应该是这个样子的:
list_seriaInfo:
- port: COM7
baudRate: 115200
parity: 0
dataBits: 0
stopBits: 0
encoding: 0
- port: COM8
baudRate: 115200
parity: 0
dataBits: 0
stopBits: 0
encoding: 0
- port: COM9
baudRate: 115200
parity: 0
dataBits: 0
stopBits: 0
encoding: 0
- port: COM10
baudRate: 115200
parity: 0
dataBits: 0
stopBits: 0
encoding: 0
modbusInfo:
ip: 127.0.0.1
port: 502
slave_addr: 1
start_addr: 8010
done_addr: 8000
同理,该文件序列化之后,应该得到上面这个类对象。
然后,我们准备一个工具类ConfigCtrl用来序列化和反序列化:
public class ConfigCtrl
{
static string yaml_path = Directory.GetCurrentDirectory() + @"\Config\config.yaml";
/// <summary>
/// 序列化操作
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
static public void Save<T>(T obj)
{
FileInfo fi = new FileInfo(yaml_path);
if (!Directory.Exists(fi.DirectoryName))
{
Directory.CreateDirectory(fi.DirectoryName);
}
StreamWriter yamlWriter = File.CreateText(yaml_path);
Serializer yamlSerializer = new Serializer();
yamlSerializer.Serialize(yamlWriter, obj);
yamlWriter.Close();
}
/// <summary>
/// 泛型反序列化操作
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
/// <exception cref="FileNotFoundException"></exception>
static public T Read<T>()
{
if (!File.Exists(yaml_path))
{
return default(T);
}
StreamReader yamlReader = File.OpenText(yaml_path);
Deserializer yamlDeserializer = new Deserializer();
//读取持久化对象
T info = yamlDeserializer.Deserialize<T>(yamlReader);
yamlReader.Close();
return info;
}
}
最后是,使用工具类:
// 反序列化
var obj = ConfigCtrl.Read<ConfigInfos>();
if (obj == null)
{
MessageBox.Show("配置文件不存在");
}
//序列化
ConfigCtrl.Save<ConfigInfos>(obj);
作者:宋桓公
出处:http://www.cnblogs.com/douzi2/
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现