通用序列化基类 只须实现该类抽象成员即可进行序列化与反序列化

8 篇文章 0 订阅

 

 

  1.     #region  文件序列化的类型
  2.     /// <summary>
  3.     /// 序列化文件的类型
  4.     /// </summary>
  5.     public enum SerializeType
  6.     {
  7.         /// <summary>
  8.         /// 字节
  9.         /// </summary>
  10.         Binary,
  11.         /// <summary>
  12.         /// xml
  13.         /// </summary>
  14.         Xml,
  15.         /// <summary>
  16.         /// soap协议的xml
  17.         /// </summary>
  18.         SoapXml
  19.     }
  20.     #endregion
  21.     /// <summary>
  22.     /// 序列化基类  by TangJingbo 2007/06
  23.     /// 进行了修改 优化 ,读取或保存失败时对原有配置文件进行备份,以防丢失配置    
  24.     /// </summary>
  25.     /// <typeparam name="T">必须有无参数的构造函数</typeparam>
  26.     [Serializable]
  27.     public abstract class ConfigBase<T> where T : ConfigBase<T>, new()
  28.     {
  29.         #region 序列化类型  可重写
  30.         protected SerializeType _CurrentSerializeType = SerializeType.Xml;
  31.         /// <summary>
  32.         /// 序列化的方式
  33.         /// </summary>      
  34.         [XmlIgnore]
  35.         protected virtual SerializeType CurrentSerializeType
  36.         {
  37.             get
  38.             {
  39.                 return _CurrentSerializeType;
  40.             }
  41.             set
  42.             {
  43.                 _CurrentSerializeType = value;
  44.             }
  45.         }
  46.         #endregion
  47.         #region 获取
  48.         /// <summary>
  49.         /// 读取缓存中的实例如果不存在则
  50.         /// 从ConfigFileName指定文件以CurrentSerializeType读取实例
  51.         /// 如果不存在则以InitConfig初始化类,创建并保存文件
  52.         /// </summary>
  53.         /// <returns></returns>
  54.         protected T Read()
  55.         {
  56.             return Read(ConfigFileName, CurrentSerializeType);
  57.         }
  58.         /// <summary>
  59.         /// 从ConfigFileName指定文件以CurrentSerializeType读取实例,如果存在缓存则移除并重新进行缓存
  60.         /// 如果不存在则以InitConfig初始化类,创建并保存文件
  61.         /// </summary>
  62.         /// <returns></returns>
  63.         protected T ResetCacheAndRead()
  64.         {
  65.             ResetCache();
  66.             return Read();
  67.         }
  68.         /// <summary>
  69.         /// 移除CacheKEY 缓存
  70.         /// </summary>
  71.         public void ResetCache()
  72.         {
  73.             HttpRuntime.Cache.Remove(CacheKEY);
  74.         }
  75.         /// <summary>
  76.         /// 获取当前类的实例
  77.         /// </summary>
  78.         public static T Instance
  79.         {
  80.             get
  81.             {
  82.                 T c = HttpRuntime.Cache[CacheKEY] as T;
  83.                 if (c == null)
  84.                 {
  85.                     c = new T().Read();
  86.                 }
  87.                 return c;
  88.             }
  89.         }
  90.         /// <summary>
  91.         /// 获取Cache缓存的key
  92.         /// </summary>
  93.         public static string CacheKEY
  94.         {
  95.             get
  96.             {
  97.                 return typeof(T).FullName;
  98.             }
  99.         }
  100.         /// <summary>
  101.         ///  从ConfigFileName指定文件以CurrentSerializeType读取实例
  102.         ///  如果不存在则以InitConfig初始化类,创建并保存文件
  103.         /// </summary>
  104.         /// <param name="configFileName"></param>
  105.         /// <param name="serializeType"></param>
  106.         /// <returns></returns>
  107.         protected T Read(string configFileName, SerializeType serializeType)
  108.         {
  109.             T t = HttpRuntime.Cache[CacheKEY] as T;
  110.             if (t != null)
  111.                 return t;
  112.             FileInfo fi = new FileInfo(configFileName);
  113.             if (fi.Exists)
  114.             {
  115.                 FileStream fs = null;
  116.                 try
  117.                 {
  118.                     // open the stream...
  119.                     fs = new FileStream(configFileName, FileMode.Open, FileAccess.Read, FileShare.None);
  120.                     IFormatter formatter = null;
  121.                     switch (serializeType)
  122.                     {
  123.                         case SerializeType.Binary:
  124.                             formatter = new BinaryFormatter();
  125.                             t = formatter.Deserialize(fs) as T;
  126.                             break;
  127.                         case SerializeType.SoapXml:
  128.                             formatter = new SoapFormatter();
  129.                             t = formatter.Deserialize(fs) as T;
  130.                             break;
  131.                         case SerializeType.Xml:
  132.                             XmlSerializer serializer = new XmlSerializer(typeof(T));
  133.                             t = serializer.Deserialize(fs) as T;
  134.                             break;
  135.                         default:
  136.                             t = default(T);
  137.                             break;
  138.                     }
  139.                     if (fs != null)
  140.                         fs.Close();
  141.                     return t;
  142.                 }
  143.                 catch (Exception ex)
  144.                 {
  145.                     Log.WriteLog(ex);
  146.                     if (fs != null)
  147.                         fs.Close();
  148.                     ///读取失败 进行备份 下面将会使用默认配置覆盖当前数据
  149.                     if (fi.Exists)
  150.                     {
  151.                         string BackupFilePath = fi.FullName + ".Read." + DateTime.Now.ToString("yyMMddHHssfff") + ".bak";
  152.                         fi.CopyTo(BackupFilePath, true);
  153.                     }
  154.                     t = Init();
  155.                     Save(t);
  156.                     return t;
  157.                 }
  158.                 finally
  159.                 {
  160.                     if (fi.Exists && t != null)
  161.                         HttpRuntime.Cache.Add(CacheKEY, t, new CacheDependency(fi.FullName),
  162.                            System.Web.Caching.Cache.NoAbsoluteExpiration,
  163.                            TimeSpan.FromDays(7),
  164.                             CacheItemPriority.NotRemovable, null);
  165.                 }
  166.             }
  167.             else
  168.             {
  169.                 if (HttpRuntime.Cache[configFileName + "init"] == null)
  170.                 {
  171.                     HttpRuntime.Cache[configFileName + "init"] = true;
  172.                 }
  173.                 else
  174.                 {
  175.                     HttpRuntime.Cache.Remove(configFileName + "init");
  176.                     throw new Exception("'" + fi.FullName + "' 文件不存在!");
  177.                 }
  178.                 t = Init();
  179.                 if (t == null || t == default(T))
  180.                     throw new Exception("初始化配置方法未返回完整的配置实例");
  181.                 Save(t);
  182.                 HttpRuntime.Cache.Add(CacheKEY, t, new CacheDependency(fi.FullName),
  183.                           System.Web.Caching.Cache.NoAbsoluteExpiration,
  184.                           TimeSpan.FromDays(7),
  185.                            CacheItemPriority.NotRemovable, null);
  186.                 return t;
  187.             }
  188.         }
  189.         #endregion
  190.         #region 保存
  191.         /// <summary>
  192.         /// 将当前实例进行保存
  193.         /// </summary>
  194.         /// <returns></returns>
  195.         public bool Save()
  196.         {
  197.             return Save(Current);
  198.         }
  199.         /// <summary>
  200.         /// 将一个实例对象保存到ConfigFileName指定的配置文件
  201.         /// </summary>
  202.         /// <param name="obj"></param>
  203.         /// <returns></returns>
  204.         protected bool Save(T obj)
  205.         {
  206.             FileStream fs = null;
  207.             FileInfo fi = new FileInfo(ConfigFileName);
  208.             string BackupFilePath = fi.FullName + ".Save." + DateTime.Now.ToString("yyMMddHHssfff") + ".bak";
  209.             ///如果存在先备份
  210.             if (fi.Exists)
  211.             {
  212.                 fi.CopyTo(BackupFilePath, true);
  213.             }
  214.              else if (!fi.Directory.Exists)
                {
                    ///目录不存在创建目录
                    fi.Directory.Create();
                }
  215.             // serialize it...
  216.             try
  217.             {
  218.                 fs = new FileStream(fi.FullName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
  219.                 IFormatter formatter = null;
  220.                 switch (CurrentSerializeType)
  221.                 {
  222.                     case SerializeType.Binary:
  223.                         formatter = new BinaryFormatter();
  224.                         formatter.Serialize(fs, obj);
  225.                         break;
  226.                     case SerializeType.SoapXml:
  227.                         formatter = new SoapFormatter();
  228.                         formatter.Serialize(fs, obj);
  229.                         break;
  230.                     case SerializeType.Xml:
  231.                         XmlSerializer serializer = new XmlSerializer(typeof(T));
  232.                         serializer.Serialize(fs, obj);
  233.                         break;
  234.                     default:
  235.                         break;
  236.                 }
  237.                 //成功则删除当前备份
  238.                 File.Delete(BackupFilePath);
  239.                 return true;
  240.             }
  241.             catch (Exception ex)
  242.             {
  243.                 throw ex;
  244.             }
  245.             finally
  246.             {
  247.                 if (fs != null)
  248.                     fs.Close();
  249.             }
  250.         }
  251.         #endregion
  252.         #region  抽象成员
  253.         /// <summary>
  254.         /// 返回子类的当前实例
  255.         /// </summary>
  256.         protected abstract T Current
  257.         {
  258.             get;
  259.         }
  260.         /// <summary>
  261.         /// 初始化配置类
  262.         /// 当持久化化文件第一次创建时,将按该实现创建一个持久化文件
  263.         /// </summary>
  264.         /// <returns></returns>
  265.         protected abstract T Init();
  266.         /// <summary>
  267.         /// 配置文件名
  268.         /// </summary>
  269.         [XmlIgnore]
  270.         public abstract string ConfigFileName
  271.         {
  272.             get;
  273.             set;
  274.         }
  275.         #endregion
  276.     }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值