在系统的开发过程中,经常遇到将系统配置参数保存在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;
}
}
/// 实体序列化成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;
}
}
仅供参考。