关于C#读写XML的公用类

XmlHelper有很多种写法,以泛型的方式保存和读取xml,可以做到像下面这么简化又实用:

调用处 var sysParam = XmlHelper.LoadFromXML<TSysParam>(ApplicationDir.SystemParamFile);

 //无参数文件时,初始化系统参数到XML文件
 XmlHelper.SaveAsXML(ApplicationDir.SystemParamFile, param);

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Xml.Serialization;

namespace Infrastructure
{
    public static class XmlHelper
    {
        /// <summary>
        /// 读取以xml格式保存的对象,如果文件不存在则自动创建,触发相关代码
        /// </summary>
        /// <typeparam name="T">类型参数</typeparam>
        /// <param name="filename">文件路径</param>
        /// <returns></returns>
        public static T LoadFromXML<T>(string fileName, Action IfFileNotExist = null)
        {
            T o = default(T);
            try
            {
                if (!File.Exists(fileName))
                {
                    if (IfFileNotExist != null)
                        IfFileNotExist.DynamicInvoke(fileName);
                    SaveAsXML(fileName, Activator.CreateInstance<T>());
                }

                using (FileStream fs = File.OpenRead(fileName))
                {
                    o = LoadFromXML<T>(fs);
                    fs.Close();
                    fs.Dispose();
                }
            }
            catch (Exception e)
            {
                if (File.Exists(fileName))
                {
                    //const string path = "配置备份";
                    //if (!Directory.Exists(path))
                    //    Directory.CreateDirectory(path);
                    File.Copy(fileName,
                        Path.Combine(Comm.AppDir, DateTime.Now.ToString("yyyy_MM_dd hh_mm_ss") + ".xml"), true);

                    Comm.InfoMessage($"加载XML异常备份操作, 请查看文件{fileName}");
                }
                throw new Exception($"加载XML异常: {e.Message}: {e.StackTrace}");
            }
            return o;
        }

        /// <summary>
        /// 将对象以xml格式保存
        /// </summary>
        /// <param name="filename">文件路径</param>
        /// <param name="o">对象</param>
        public static bool SaveAsXML(string fileName, object o)
        {
            try
            {
                using (FileStream fs = File.Create(fileName))
                {
                    XmlSerializer sr = new XmlSerializer(o.GetType());
                    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                    ns.Add(string.Empty, string.Empty); //去除根节点的名空间

                    sr.Serialize(fs, o, ns);
                    fs.Close();
                }
                return true;
            }
            catch (Exception e)
            {
                throw new Exception($"保存XML异常: {e.Message} 堆栈信息: {e.StackTrace}");
            }
        }

        private static T LoadFromXML<T>(Stream stream)
        {
            T o = default(T);
            XmlSerializer sr = new XmlSerializer(typeof(T));
            o = (T)sr.Deserialize(stream);
            return o;
        }              
    }
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值