zoukankan      html  css  js  c++  java
  • 关于在C#中,将XML源文件序列化和反序列化的问题

        在系统的开发过程中,经常遇到将系统配置参数保存在XML文件中的情况,这样的好处是调用参数时不需要读取数据库,并且能够设置系统参数缓存对文件的依赖。

    但是,这种数据的存数方式也会产生一些问题。

        我们设置和修改系统参数通常都是在系统的后台操作,但是由于业务需要,经常会出现系统的后台和前台不再同一个网站目录中甚至不在同一台服务器上。这样,系统的 前台或者其他部分根本无法调用后台系统参数设置的xml文件。

        所以,可以考虑将序列化过的XML文件保存在数据库中。

        .NET中内置序列化和反序列化的方法。不知道的可以自己看一下MSDN。

        这些方法的缺点是只提供将实体类序列化为物理文件和将物理文件序列化为实体,这就造成了一个很严重的问题,如果我们要将XML文件保存到数据库,就要再进行一个文件的读取操作。严重影响了程序性能,增加服务器负载。

        最近在研究Discuz NT!代码的时候,竟然发现Discuz底层中存在这两个方法:

            /// <summary>
            
    /// 实体序列化成XML源文件
            
    /// </summary>
            
    /// <param name="obj">对象</param>
            
    /// <returns>xml源文件字符串</returns>
            public static string Serialize(object obj)
            {
                
    string returnStr = "";
                XmlSerializer serializer 
    = GetSerializer(obj.GetType());
                MemoryStream ms 
    = new MemoryStream();
                XmlTextWriter xtw 
    = null;
                StreamReader sr 
    = null;
                
    try
                {
                    xtw 
    = new System.Xml.XmlTextWriter(ms, Encoding.UTF8);
                    xtw.Formatting 
    = System.Xml.Formatting.Indented;
                    serializer.Serialize(xtw, obj);
                    ms.Seek(
    0, SeekOrigin.Begin);
                    sr 
    = new StreamReader(ms);
                    returnStr 
    = sr.ReadToEnd();
                }
                
    catch (Exception ex)
                {
                    
    throw ex;
                }
                
    finally
                {
                    
    if (xtw != null)
                        xtw.Close();
                    
    if (sr != null)
                        sr.Close();
                    ms.Close();
                }
                
    return returnStr;

            }

            
    /// <summary>
            
    /// XML源文件反序列化成实体
            
    /// </summary>
            
    /// <param name="type">实体类型</param>
            
    /// <param name="s">XML源文件</param>
            
    /// <returns></returns>
            public static object DeSerialize(Type type, string s)
            {
                
    byte[] b = System.Text.Encoding.UTF8.GetBytes(s);
                
    try
                {
                    XmlSerializer serializer 
    = GetSerializer(type);
                    
    return serializer.Deserialize(new MemoryStream(b));
                }
                
    catch (Exception ex)
                {
                    
    throw ex;
                }
            }

     仅供参考。

  • 相关阅读:
    从零开始搭建EasyDarwin环境——Linux系统开发环境Golang的搭建
    TSINGSEE青犀视频直播关键帧和空白关键帧都起到什么作用?
    TSINGSEE青犀视频平台监控程序新增按时间检测的实现
    TSINGSEE青犀视频开发AI识别dlib使用GPU如何激活?
    EasyCVR/EasyGBS程序运行为什么会出现too many open files?
    一篇文章让你了解视频监控系统搭建过程中如何选择存储方式
    MS SQL Server树型结构数据显示的SQL语句(纯SQL语句,不用函数)
    oracle中解决汉字无法显示、输入问题
    福州某火锅城餐饮收费系统查询代码
    (原创)基于关系数据库系统链式存储的树型结构数据,求某结点下的子树所有结点算法(tsql语言实现)
  • 原文地址:https://www.cnblogs.com/kuibono/p/1866842.html
Copyright © 2011-2022 走看看