在纯.Net里面,对一个Object进行系列化和反系列化,并存盘和读取
一、要系列化的Object是啥类型?
/// <summary>
/// 服务器配置——《务器配置文件.json》
/// </summary>
public class ServerConfig
{
/// <summary>
/// 命令通信的端口
/// </summary>
public int CmdPort { get; set; }
/// <summary>
/// 数据通信的端口
/// </summary>
public int DataPort { get; set; }
}
二、Object系列化成json字符串并保存到本地
- 【1】系列化并存盘
/// <summary>
/// 把一个object系列化成一个string,然后保存成[.json]文件到指定的位置
/// </summary>
/// <typeparam name="T">要系列化的对象类型</typeparam>
/// <param name="obj">要系列化的对象</param>
/// <param name="path">路径和文件名</param>
/// <returns>(成功与否-success,json字符串-jsonStr,失败信息-info)</returns>
public static (bool success, string jsonStr, string info) SaveSerializedObjectToJson<T>(T obj,string path)
{
(bool success, string jsonStr, string info) rtn; //返回值
string jsonStr = "";
try
{
jsonStr = JsonSerializer.Serialize<T>(obj);
File.WriteAllText(path, jsonStr);
rtn = (true, jsonStr, "ok");
}
catch (Exception ex)
{
rtn = (false, "", ex.ToString());
Console.WriteLine($"系列化和保存json文件出错:{ex.ToString()}");
}
return rtn;
}
- 【2】测试——代码绑定在一个Button事件里
/// <summary>
/// 确定后:端口保存
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
try
{
//保存数据
string filePath = $@"{Application.StartupPath}\portConfig\服务器配置文件.json";
ServerConfig cfg = new ServerConfig();
cfg.CmdPort = 2555; //int.Parse(textBoxCmdText.Text);
cfg.DataPort = 2556; //int.Parse(textBoxDataObject.Text);
var res = ServerData.SaveSerializedObjectToJson(cfg, filePath);
if (!res.success)
{
throw new Exception(res.info);
}
}
catch (Exception ex)
{
MessageBox.Show($"保存端口信息出错:{ex.ToString()}");
}
}
三、从本地读取json文件,并解析成指定的类型
- 【1】读取json文件并反系列化
/// <summary>
/// 读取json文件,解析成给定类型(T)的对象
/// 用named tuple 把报错返回上一级进行处理
/// </summary>
/// <typeparam name="T">用来解析json数据的类型</typeparam>
/// <param name="path">json文件地址 path + name</param>
/// <returns>元组(成功与否,解析出来的对象,成功或者报错的信息)</returns>
public static (bool success,T obj,string info) ReadJsonAsObjectViaTuple<T>(string path)
{
(bool success, T obj, string info) rtn;
try
{
var jsonStr = File.ReadAllText(path);
var obj = JsonSerializer.Deserialize<T>(jsonStr);
rtn = (true, obj, "sucessful");
}
catch (Exception ex)
{
rtn = (false, default(T), ex.ToString());
Console.WriteLine($"读取和解析json文件出错:{ex.ToString()}");
}
return rtn;
}
- 【2】测试
//*加载配置文件:《服务器配置文件.json》
var path = $@"{Application.StartupPath}\portConfig\服务器配置文件.json";
Console.WriteLine($"path = {path}");
var res = ServerData.ReadJsonAsObjectViaTuple<ServerConfig>(path);
if (res.success == false) //配置文件读取失败
{
MessageBox.Show(text: $"截取以下报错信息后联系管理员处理:\n \n {res.info}", caption: "读取服务器配置文件出错", MessageBoxButtons.OK);
Application.Exit();
Console.WriteLine("程序退出!");
}
else //配置文件读取成功
{
//var serverConfig = ServerData.ReadJsonAsObject<ServerConfig>(path);
var serverConfig = res.obj;
Console.WriteLine($"~~~~~~~~命令通信端口 = {serverConfig.CmdPort} \n 数据通信端口 = {serverConfig.DataPort}");
}