Cache缓存依赖于XML

12 篇文章 0 订阅
2 篇文章 0 订阅

// 此处代码整理于博客【在.net中读写config文件的各种方法】的示例代码
// http://www.cnblogs.com/fish-li/archive/2011/12/18/2292037.html


public static class XmlHelper

{
    private static void XmlSerializeInternal(Stream stream, object o, Encoding encoding)
    {
        if( o == null )
            throw new ArgumentNullException("o");
        if( encoding == null )
            throw new ArgumentNullException("encoding");


        XmlSerializer serializer = new XmlSerializer(o.GetType());


        XmlWriterSettings settings = new XmlWriterSettings();
        settings.Indent = true;
        settings.NewLineChars = "\r\n";
        settings.Encoding = encoding;
        settings.IndentChars = "    ";


        using( XmlWriter writer = XmlWriter.Create(stream, settings) ) {
            serializer.Serialize(writer, o);
            writer.Close();
        }
    }


    /// <summary>
    /// 将一个对象序列化为XML字符串
    /// </summary>
    /// <param name="o">要序列化的对象</param>
    /// <param name="encoding">编码方式</param>
    /// <returns>序列化产生的XML字符串</returns>
    public static string XmlSerialize(object o, Encoding encoding)
    {
        using( MemoryStream stream = new MemoryStream() ) {
            XmlSerializeInternal(stream, o, encoding);


            stream.Position = 0;
            using( StreamReader reader = new StreamReader(stream, encoding) ) {
                return reader.ReadToEnd();
            }
        }
    }


    /// <summary>
    /// 将一个对象按XML序列化的方式写入到一个文件
    /// </summary>
    /// <param name="o">要序列化的对象</param>
    /// <param name="path">保存文件路径</param>
    /// <param name="encoding">编码方式</param>
    public static void XmlSerializeToFile(object o, string path, Encoding encoding)
    {
        if( string.IsNullOrEmpty(path) )
            throw new ArgumentNullException("path");


        using( FileStream file = new FileStream(path, FileMode.Create, FileAccess.Write) ) {
            XmlSerializeInternal(file, o, encoding);
        }
    }


    /// <summary>
    /// 从XML字符串中反序列化对象
    /// </summary>
    /// <typeparam name="T">结果对象类型</typeparam>
    /// <param name="s">包含对象的XML字符串</param>
    /// <param name="encoding">编码方式</param>
    /// <returns>反序列化得到的对象</returns>
    public static T XmlDeserialize<T>(string s, Encoding encoding)
    {
        if( string.IsNullOrEmpty(s) )
            throw new ArgumentNullException("s");
        if( encoding == null )
            throw new ArgumentNullException("encoding");


        XmlSerializer mySerializer = new XmlSerializer(typeof(T));
        using( MemoryStream ms = new MemoryStream(encoding.GetBytes(s)) ) {
            using( StreamReader sr = new StreamReader(ms, encoding) ) {
                return (T)mySerializer.Deserialize(sr);
            }
        }
    }


    /// <summary>
    /// 读入一个文件,并按XML的方式反序列化对象。
    /// </summary>
    /// <typeparam name="T">结果对象类型</typeparam>
    /// <param name="path">文件路径</param>
    /// <param name="encoding">编码方式</param>
    /// <returns>反序列化得到的对象</returns>
    public static T XmlDeserializeFromFile<T>(string path, Encoding encoding)
    {
        if( string.IsNullOrEmpty(path) )
            throw new ArgumentNullException("path");
        if( encoding == null )
            throw new ArgumentNullException("encoding");


        string xml = File.ReadAllText(path, encoding);
        return XmlDeserialize<T>(xml, encoding);
    }
}




/// <summary>
    /// 这个类的属性是xml的节点
    /// </summary>
    public class RunOptions
    {
        public string WebSiteUrl;
        public string UserName;


    }
    
    /// <summary>
    /// 这个类用于读取xml的数据,并且缓存依赖
    /// </summary>
    public static class WebSiteApp
    {
        private static readonly string RunOptionsCacheKey = Guid.NewGuid().ToString();


        public static RunOptions RunOptions
        {
            get
            {
                // 首先尝试从缓存中获取运行参数
                RunOptions options = HttpRuntime.Cache[RunOptionsCacheKey] as RunOptions;


                if (options == null)
                {
                    // 缓存中没有,则从文件中加载
                    string path = HttpContext.Current.Server.MapPath("~/App_Data/RunOptions.xml");
                    options = XmlHelper.XmlDeserializeFromFile<RunOptions>(path, Encoding.UTF8);


                    // 把从文件中读到的结果放入缓存,并设置与文件的依赖关系。
                    CacheDependency dep = new CacheDependency(path);
                    // 如果您的参数较复杂,与多个文件相关,那么也可以使用下面的方式,传递多个文件路径。
                    //CacheDependency dep = new CacheDependency(new string[] { path });
                    HttpRuntime.Cache.Insert(RunOptionsCacheKey, options, dep);
                }


                return options;
            }
        }
    }
    
    
    <?xml version="1.0" encoding="utf-8"?>
<RunOptions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <WebSiteUrl>http://www.cnblogs.com/fish-li</WebSiteUrl>
  <UserName>潘继号</UserName>
</RunOptions>




<p>WebSiteUrl: <%= WebApplication1.WebSiteApp.RunOptions.WebSiteUrl %></p>
    <p>UserName: <%= WebApplication1.WebSiteApp.RunOptions.UserName %></p>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值