关于在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;
            }
        }

 

 仅供参考。

转载于:https://www.cnblogs.com/kuibono/archive/2010/11/02/1866842.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值