C#中把object系列化成json并存盘,然后读取解析

在纯.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}");             
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值