通用序列化基类 只须实现该类抽象成员即可进行序列化与反序列化
2008-09-18 15:57
375 查看
#region 文件序列化的类型
/// <summary>
/// 序列化文件的类型
/// </summary>
public enum SerializeType
{
/// <summary>
/// 字节
/// </summary>
Binary,
/// <summary>
/// xml
/// </summary>
Xml,
/// <summary>
/// soap协议的xml
/// </summary>
SoapXml
}
#endregion
/// <summary>
/// 序列化基类 by TangJingbo 2007/06
/// 进行了修改 优化 ,读取或保存失败时对原有配置文件进行备份,以防丢失配置
/// </summary>
/// <typeparam name="T">必须有无参数的构造函数</typeparam>
[Serializable]
public abstract class ConfigBase<T> where T : ConfigBase<T>, new()
{
#region 序列化类型 可重写
protected SerializeType _CurrentSerializeType = SerializeType.Xml;
/// <summary>
/// 序列化的方式
/// </summary>
[XmlIgnore]
protected virtual SerializeType CurrentSerializeType
{
get
{
return _CurrentSerializeType;
}
set
{
_CurrentSerializeType = value;
}
}
#endregion
#region 获取
/// <summary>
/// 读取缓存中的实例如果不存在则
/// 从ConfigFileName指定文件以CurrentSerializeType读取实例
/// 如果不存在则以InitConfig初始化类,创建并保存文件
/// </summary>
/// <returns></returns>
protected T Read()
{
return Read(ConfigFileName, CurrentSerializeType);
}
/// <summary>
/// 从ConfigFileName指定文件以CurrentSerializeType读取实例,如果存在缓存则移除并重新进行缓存
/// 如果不存在则以InitConfig初始化类,创建并保存文件
/// </summary>
/// <returns></returns>
protected T ResetCacheAndRead()
{
ResetCache();
return Read();
}
/// <summary>
/// 移除CacheKEY 缓存
/// </summary>
public void ResetCache()
{
HttpRuntime.Cache.Remove(CacheKEY);
}
/// <summary>
/// 获取当前类的实例
/// </summary>
public static T Instance
{
get
{
T c = HttpRuntime.Cache[CacheKEY] as T;
if (c == null)
{
c = new T().Read();
}
return c;
}
}
/// <summary>
/// 获取Cache缓存的key
/// </summary>
public static string CacheKEY
{
get
{
return typeof(T).FullName;
}
}
/// <summary>
/// 从ConfigFileName指定文件以CurrentSerializeType读取实例
/// 如果不存在则以InitConfig初始化类,创建并保存文件
/// </summary>
/// <param name="configFileName"></param>
/// <param name="serializeType"></param>
/// <returns></returns>
protected T Read(string configFileName, SerializeType serializeType)
{
T t = HttpRuntime.Cache[CacheKEY] as T;
if (t != null)
return t;
FileInfo fi = new FileInfo(configFileName);
if (fi.Exists)
{
FileStream fs = null;
try
{
// open the stream...
fs = new FileStream(configFileName, FileMode.Open, FileAccess.Read, FileShare.None);
IFormatter formatter = null;
switch (serializeType)
{
case SerializeType.Binary:
formatter = new BinaryFormatter();
t = formatter.Deserialize(fs) as T;
break;
case SerializeType.SoapXml:
formatter = new SoapFormatter();
t = formatter.Deserialize(fs) as T;
break;
case SerializeType.Xml:
XmlSerializer serializer = new XmlSerializer(typeof(T));
t = serializer.Deserialize(fs) as T;
break;
default:
t = default(T);
break;
}
if (fs != null)
fs.Close();
return t;
}
catch (Exception ex)
{
Log.WriteLog(ex);
if (fs != null)
fs.Close();
///读取失败 进行备份 下面将会使用默认配置覆盖当前数据
if (fi.Exists)
{
string BackupFilePath = fi.FullName + ".Read." + DateTime.Now.ToString("yyMMddHHssfff") + ".bak";
fi.CopyTo(BackupFilePath, true);
}
t = Init();
Save(t);
return t;
}
finally
{
if (fi.Exists && t != null)
HttpRuntime.Cache.Add(CacheKEY, t, new CacheDependency(fi.FullName),
System.Web.Caching.Cache.NoAbsoluteExpiration,
TimeSpan.FromDays(7),
CacheItemPriority.NotRemovable, null);
}
}
else
{
if (HttpRuntime.Cache[configFileName + "init"] == null)
{
HttpRuntime.Cache[configFileName + "init"] = true;
}
else
{
HttpRuntime.Cache.Remove(configFileName + "init");
throw new Exception("'" + fi.FullName + "' 文件不存在!");
}
t = Init();
if (t == null || t == default(T))
throw new Exception("初始化配置方法未返回完整的配置实例");
Save(t);
HttpRuntime.Cache.Add(CacheKEY, t, new CacheDependency(fi.FullName),
System.Web.Caching.Cache.NoAbsoluteExpiration,
TimeSpan.FromDays(7),
CacheItemPriority.NotRemovable, null);
return t;
}
}
#endregion
#region 保存
/// <summary>
/// 将当前实例进行保存
/// </summary>
/// <returns></returns>
public bool Save()
{
return Save(Current);
}
/// <summary>
/// 将一个实例对象保存到ConfigFileName指定的配置文件
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
protected bool Save(T obj)
{
FileStream fs = null;
FileInfo fi = new FileInfo(ConfigFileName);
string BackupFilePath = fi.FullName + ".Save." + DateTime.Now.ToString("yyMMddHHssfff") + ".bak";
///如果存在先备份
if (fi.Exists)
{
fi.CopyTo(BackupFilePath, true);
}
else if (!fi.Directory.Exists)
{
///目录不存在创建目录
fi.Directory.Create();
}
// serialize it...
try
{
fs = new FileStream(fi.FullName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
IFormatter formatter = null;
switch (CurrentSerializeType)
{
case SerializeType.Binary:
formatter = new BinaryFormatter();
formatter.Serialize(fs, obj);
break;
case SerializeType.SoapXml:
formatter = new SoapFormatter();
formatter.Serialize(fs, obj);
break;
case SerializeType.Xml:
XmlSerializer serializer = new XmlSerializer(typeof(T));
serializer.Serialize(fs, obj);
break;
default:
break;
}
//成功则删除当前备份
File.Delete(BackupFilePath);
return true;
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (fs != null)
fs.Close();
}
}
#endregion
#region 抽象成员
/// <summary>
/// 返回子类的当前实例
/// </summary>
protected abstract T Current
{
get;
}
/// <summary>
/// 初始化配置类
/// 当持久化化文件第一次创建时,将按该实现创建一个持久化文件
/// </summary>
/// <returns></returns>
protected abstract T Init();
/// <summary>
/// 配置文件名
/// </summary>
[XmlIgnore]
public abstract string ConfigFileName
{
get;
set;
}
#endregion
}
/// <summary>
/// 序列化文件的类型
/// </summary>
public enum SerializeType
{
/// <summary>
/// 字节
/// </summary>
Binary,
/// <summary>
/// xml
/// </summary>
Xml,
/// <summary>
/// soap协议的xml
/// </summary>
SoapXml
}
#endregion
/// <summary>
/// 序列化基类 by TangJingbo 2007/06
/// 进行了修改 优化 ,读取或保存失败时对原有配置文件进行备份,以防丢失配置
/// </summary>
/// <typeparam name="T">必须有无参数的构造函数</typeparam>
[Serializable]
public abstract class ConfigBase<T> where T : ConfigBase<T>, new()
{
#region 序列化类型 可重写
protected SerializeType _CurrentSerializeType = SerializeType.Xml;
/// <summary>
/// 序列化的方式
/// </summary>
[XmlIgnore]
protected virtual SerializeType CurrentSerializeType
{
get
{
return _CurrentSerializeType;
}
set
{
_CurrentSerializeType = value;
}
}
#endregion
#region 获取
/// <summary>
/// 读取缓存中的实例如果不存在则
/// 从ConfigFileName指定文件以CurrentSerializeType读取实例
/// 如果不存在则以InitConfig初始化类,创建并保存文件
/// </summary>
/// <returns></returns>
protected T Read()
{
return Read(ConfigFileName, CurrentSerializeType);
}
/// <summary>
/// 从ConfigFileName指定文件以CurrentSerializeType读取实例,如果存在缓存则移除并重新进行缓存
/// 如果不存在则以InitConfig初始化类,创建并保存文件
/// </summary>
/// <returns></returns>
protected T ResetCacheAndRead()
{
ResetCache();
return Read();
}
/// <summary>
/// 移除CacheKEY 缓存
/// </summary>
public void ResetCache()
{
HttpRuntime.Cache.Remove(CacheKEY);
}
/// <summary>
/// 获取当前类的实例
/// </summary>
public static T Instance
{
get
{
T c = HttpRuntime.Cache[CacheKEY] as T;
if (c == null)
{
c = new T().Read();
}
return c;
}
}
/// <summary>
/// 获取Cache缓存的key
/// </summary>
public static string CacheKEY
{
get
{
return typeof(T).FullName;
}
}
/// <summary>
/// 从ConfigFileName指定文件以CurrentSerializeType读取实例
/// 如果不存在则以InitConfig初始化类,创建并保存文件
/// </summary>
/// <param name="configFileName"></param>
/// <param name="serializeType"></param>
/// <returns></returns>
protected T Read(string configFileName, SerializeType serializeType)
{
T t = HttpRuntime.Cache[CacheKEY] as T;
if (t != null)
return t;
FileInfo fi = new FileInfo(configFileName);
if (fi.Exists)
{
FileStream fs = null;
try
{
// open the stream...
fs = new FileStream(configFileName, FileMode.Open, FileAccess.Read, FileShare.None);
IFormatter formatter = null;
switch (serializeType)
{
case SerializeType.Binary:
formatter = new BinaryFormatter();
t = formatter.Deserialize(fs) as T;
break;
case SerializeType.SoapXml:
formatter = new SoapFormatter();
t = formatter.Deserialize(fs) as T;
break;
case SerializeType.Xml:
XmlSerializer serializer = new XmlSerializer(typeof(T));
t = serializer.Deserialize(fs) as T;
break;
default:
t = default(T);
break;
}
if (fs != null)
fs.Close();
return t;
}
catch (Exception ex)
{
Log.WriteLog(ex);
if (fs != null)
fs.Close();
///读取失败 进行备份 下面将会使用默认配置覆盖当前数据
if (fi.Exists)
{
string BackupFilePath = fi.FullName + ".Read." + DateTime.Now.ToString("yyMMddHHssfff") + ".bak";
fi.CopyTo(BackupFilePath, true);
}
t = Init();
Save(t);
return t;
}
finally
{
if (fi.Exists && t != null)
HttpRuntime.Cache.Add(CacheKEY, t, new CacheDependency(fi.FullName),
System.Web.Caching.Cache.NoAbsoluteExpiration,
TimeSpan.FromDays(7),
CacheItemPriority.NotRemovable, null);
}
}
else
{
if (HttpRuntime.Cache[configFileName + "init"] == null)
{
HttpRuntime.Cache[configFileName + "init"] = true;
}
else
{
HttpRuntime.Cache.Remove(configFileName + "init");
throw new Exception("'" + fi.FullName + "' 文件不存在!");
}
t = Init();
if (t == null || t == default(T))
throw new Exception("初始化配置方法未返回完整的配置实例");
Save(t);
HttpRuntime.Cache.Add(CacheKEY, t, new CacheDependency(fi.FullName),
System.Web.Caching.Cache.NoAbsoluteExpiration,
TimeSpan.FromDays(7),
CacheItemPriority.NotRemovable, null);
return t;
}
}
#endregion
#region 保存
/// <summary>
/// 将当前实例进行保存
/// </summary>
/// <returns></returns>
public bool Save()
{
return Save(Current);
}
/// <summary>
/// 将一个实例对象保存到ConfigFileName指定的配置文件
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
protected bool Save(T obj)
{
FileStream fs = null;
FileInfo fi = new FileInfo(ConfigFileName);
string BackupFilePath = fi.FullName + ".Save." + DateTime.Now.ToString("yyMMddHHssfff") + ".bak";
///如果存在先备份
if (fi.Exists)
{
fi.CopyTo(BackupFilePath, true);
}
else if (!fi.Directory.Exists)
{
///目录不存在创建目录
fi.Directory.Create();
}
// serialize it...
try
{
fs = new FileStream(fi.FullName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
IFormatter formatter = null;
switch (CurrentSerializeType)
{
case SerializeType.Binary:
formatter = new BinaryFormatter();
formatter.Serialize(fs, obj);
break;
case SerializeType.SoapXml:
formatter = new SoapFormatter();
formatter.Serialize(fs, obj);
break;
case SerializeType.Xml:
XmlSerializer serializer = new XmlSerializer(typeof(T));
serializer.Serialize(fs, obj);
break;
default:
break;
}
//成功则删除当前备份
File.Delete(BackupFilePath);
return true;
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (fs != null)
fs.Close();
}
}
#endregion
#region 抽象成员
/// <summary>
/// 返回子类的当前实例
/// </summary>
protected abstract T Current
{
get;
}
/// <summary>
/// 初始化配置类
/// 当持久化化文件第一次创建时,将按该实现创建一个持久化文件
/// </summary>
/// <returns></returns>
protected abstract T Init();
/// <summary>
/// 配置文件名
/// </summary>
[XmlIgnore]
public abstract string ConfigFileName
{
get;
set;
}
#endregion
}
相关文章推荐
- 通用序列化基类 只须实现该类抽象成员即可进行序列化与反序列化
- 类实现Serializable接口进行序列化和反序列化操作
- 用C#接口实现通用的文本数据序列化(ZT)
- 注解实现json序列化的时候自动进行数据脱敏
- C# 通用存储过程ORMapping的实现 [基类实现篇]
- 冰编程对派出类的功能进行验证。。 轿车类等 派生出自行车类 停车等方法。然后从该类为基类 最大速度。重量等字段以及开车 要求具有速度 定义一个车辆类
- ssh项目实战----分页功能的完整的实现(通用分页、基类实现)
- 【android实战经验】实现Parcelable接口进行对象序列化
- 数据库的逻辑层类,用一个基类进行实现
- Objective-C NSData与实现NSCoding协议进行序列化和反序列化
- (小工具)Java反射机制实现任意对象集合按指定任意字段进行分组通用程序实践
- 自动解析复杂类的属性 实现归档或者进行序列化 反序列话的时候为每一个属性添加序列化方法的繁琐
- 今天无意中发现JavaBean类基本都要求实现了Serializable接口,以前只是知道序列化以后,可以通过io流的方式将对象序列化和反序列化,进行存取,但不知道为什么需要序列化,今天总结一下
- 并编程对派出类的功能进行验证。。 轿车类等 派生出自行车类 停车等方法。然后从该类为基类 最大速度。重量等字段以及开车 要求具有速度 定义一个车辆类
- 【struts2+hibernate+spring项目实战】分页功能的完整的实现(通用分页、基类实现)
- c#序列化与反序列化通用方法, 使用protobuf-net实现
- [.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类
- C# 编写通用的JSON数据进行序列化和反序列化
- 自己开发的一款基于PagedDataSource的datalist repeater控件,只需要在源程序中添加三行代码,即可实现通用分页
- 用C#接口实现通用的文本数据序列化