web.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
      ……
      <add key="Accounts_SettingsFile" value="~/Config/Accounts.Config" />
      ……
  </appSettings>
……
</configuration>
ModuleSettings.cs:
namespace Wrox.WebModules.Accounts.Configuration
{
   public class ModuleSettings //ModuleSetting中的所有属性都有XmlElement属性标记,这是因为我们要把设置序列化为XML,为此你的程序在下面的ModuleConfig中使用了System.Xml.Serialization名称空间中的XmlSerializer类。(接着看ModuleConfig类的解释)   {
      private string connectionString;
      public ModuleSettings()
      { }
      [XmlElement] //表示一个属性,属性是可以应用的装配件中代码块上的额外信息,比如类、方法、属性。属性是一个类,确切点就是一个包含装配件中其他数据的类,这些数据涉及到装配件或装配件中的任何类
      public string ConnectionString
      {
         get 
         {
            return connectionString;
         }
         set
         {
            connectionString = value;
         }
      }
   }
}
ModuleConfig.cs:
namespace Wrox.WebModules.Accounts.Configuration
{
   public class ModuleConfig //这个类由于ModuleSettings没有任何序列化它本身的方法,所以这个任务就由ModuleConfig来完成了。
   {
      public static ModuleSettings GetSettings()
      {
         HttpContext context = HttpContext.Current; //先说说HttpContext类,这个类封装了有关个别HTTP请求的所有HTTP特定的信息,当前的Current为当前HTTP请求获取一个HttpContext对象
         ModuleSettings data = (ModuleSettings)context.Cache["Accounts_Settings"]; 
         if (data == null)
         {
            XmlSerializer serializer = new XmlSerializer(typeof(ModuleSettings));//这是将对象序列化,序列化就是将对象的状态存储到内存、二进制文件或ASCII文件中的过程。另外,序列化将创建一个新对象,其状态由存储在一个给定文件中的数据来设置。你不是有个XML文件吗,使用它可以序列化XML文件中对应的属性。不知道看懂了吗,我认为解释的很详细了。

解决方案 »

  1.   

    哦,掉了一点,我继续说完
     if (data == null)
             {
                XmlSerializer serializer = new XmlSerializer(typeof(ModuleSettings));// 建立一个ModuleSettings属性的XmlSerializer对象,你不是在前面设置了ModuleSettings属性了吗,呵呵
                try //注意:1,设置文件的路径不是硬编码,而是作为一个参数传送的。这个是必须的,因为这个代码将编译成装配件中,可由任意的客户使用,而且设置文件可以驻留在不同的位置上。            {
                   string fileName = HttpContext.Current.Server.MapPath(GetSettingsFile());
                   FileStream fs = new FileStream(fileName, FileMode.Open);
                   data = (ModuleSettings)serializer.Deserialize(fs);//这个是XmlSerializer的Deserialize()方法获取对象的状态,得到的ModuleSettings对象存储在缓存中,以备将来使用
                   fs.Close();
                   context.Cache.Insert("Accounts_Settings", data, new  CacheDependency(fileName));//这个你要注意第三个参数,它表示存储在缓存中的项目依赖于作为参数传送的文件,如果这个文件被更新,缓存中的项目就不再有效,所以如果你再次试图访问设置的时候,需要再次对文件序列化。
                }
                catch (System.IO.FileNotFoundException)
                {
                   data = new ModuleSettings();
                }
             }
             return data;
          }
      

  2.   

    public class ModuleSettings
    这个类主要是把求连接字符串的操作封装起来
    public class ModuleSettings
    这个是为上面那个服务的
    应该不是很难看懂吧
      

  3.   

    //////////////////////////////////////////////////////////
    ////不好意思,最近没有来CSDN,对于你的问题我继续讲解:///
    ////////////////////////////////////////////////////////
    我对序列化,反序列化还是有点不太明白,序列化只是为了在磁盘保存对象?要真正用对象的时候,还必须把它反序列化?
    比如:
    public static ModuleSettings GetSettings()
          {
    ……       
                   data = (ModuleSettings)serializer.Deserialize(fs);//Deserialize是反序列化;反序列的“对象”是前面的在web.config中标识而得到的“~/Config/Accounts.Config”文件吗?
                   ……
                }
               ……       
             return data;
          }不好意思打扰,
    再次谢谢您的讲解。
    /////////////////////////////////////////////////////////////
    answer your question here
    1.你首先要知道什么是序列化,为什么要序列化。
       .net的运行时环境用来支持用户定义类型的流化的机制。它是将对象实例的状态存储到存储媒体的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。    序列化的目的:
      1、以某种存储形式使自定义对象持久化;
        2、将对象从一个地方传递到另一个地方。                                        实质上序列化机制是将类的值转化为一个一般的字节流,然后就可以将该流写到磁盘文件或任何其他流化目标上。而要想实际的写出这个流,就要使用那些实现了IFormatter接口的类里的Serialize和Deserialize方法。ok,你要知道的就这么多了,呵呵,还满意吗?