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文件中对应的属性。不知道看懂了吗,我认为解释的很详细了。
<?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文件中对应的属性。不知道看懂了吗,我认为解释的很详细了。
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;
}
这个类主要是把求连接字符串的操作封装起来
public class ModuleSettings
这个是为上面那个服务的
应该不是很难看懂吧
////不好意思,最近没有来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,你要知道的就这么多了,呵呵,还满意吗?