zoukankan      html  css  js  c++  java
  • 从discuz 里扒过来的一个通用序列化和反序列化类

    感觉蛮好用的。我将一些常用的实体类型序列化成xml格式保存成xml,在系统运行时,先将其读取到缓存。

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Xml.Serialization;
    using System.IO;
    using System.Xml;
    
    namespace HMYY.Common
    {
        public class SerializationHelper
        {
    
            /* 字典,用来存储XmlSerializer 
    
           * 注意是此处是static 
    
           * 实际上起缓存的作用 
    
           */
            private static Dictionary<int, XmlSerializer> serializer_dict = new Dictionary<int, XmlSerializer>();
    
            /// <summary> 
    
            /// 为给予的类匹配一个XmlSerializer 对象, 
    
            /// 若之前就使用过,则从缓存里调出来,若没有, 
    
            /// 则新建一个对应的XmlSerializer 对象。 
    
            /// </summary> 
    
            /// <param name="t">给予的类</param> 
    
            /// <returns></returns> 
            public static XmlSerializer GetSerializer(Type t)
            {
                //先获得type 的哈希值,作为字典的索引 
                int type_hash = t.GetHashCode();
                //如果字典里没有这个type的哈希,就创建一个,放到字典表里 
    
                if (!serializer_dict.ContainsKey(type_hash))
    
                    serializer_dict.Add(type_hash, new XmlSerializer(t));
    
                //查询到这个哈希对应的对象,传出去 
                return serializer_dict[type_hash];
            }
    
            /// <summary>
            /// 反序列化
            /// </summary>
            /// <param name="type">对象类型</param>
            /// <param name="filepath">文件路径</param>
            /// <returns></returns>
            public static object Load(Type type, string filepath)
            {
                FileStream fs = null;
                try
                {
                    fs = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.Read);
                    XmlSerializer serializer = new XmlSerializer(type);
                    return serializer.Deserialize(fs);
                }
                catch(Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    if (fs != null)
                    {
                        fs.Close();
                        fs.Dispose();
                    }
                }
    
    
            }
    
            /// <summary>
            /// 序列化
            /// </summary>
            /// <param name="obj">对象</param>
            /// <param name="filename">文件路径</param>
            public static bool Save(object obj, string filepath)
            {
                bool Isok = false;
                FileStream fs = null;
                try
                {
                    fs = new FileStream(filepath, FileMode.Create, FileAccess.Write);
                    XmlSerializer serializer = new XmlSerializer(obj.GetType());
                    serializer.Serialize(fs, obj);
                    Isok = true;
                }
                catch(Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    if (fs != null)
                    {
                        fs.Close();
                        fs.Dispose();
                    }
                }
    
                return Isok;
            }
    
    
            /// <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
                {
    
                    //实例化一个xml的写对象,其中使用utf-8 编码,写入到刚实例化的内存流中去 
    
                    xtw = new System.Xml.XmlTextWriter(ms, Encoding.UTF8);
    
                    //设置缩进方式 
    
                    xtw.Formatting = System.Xml.Formatting.Indented;
    
    
    
                    //序列化它 
    
                    serializer.Serialize(xtw, obj);
    
                    /* 
    
                     * 此时内存流已经指向写完的地方, 
    
                     * 要再次读取到这个内存里的内容, 
    
                     * 需要将其"指针"指向内存流的开始 
    
                     * 下面一句就是做这个事情 
    
                     * param1  针对param2 的偏移量, 
    
                     * param2  内存开始的地方 
    
                     */
    
                    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> 
    
            /// 反序列化 ,通过一个string 
    
            /// </summary> 
    
            /// <param name="type">反序列化的类的类型</param> 
    
            /// <param name="s">序列源</param> 
    
            /// <returns></returns> 
    
            public static object DeSerialize(Type type, string s)
            {
    
                /* 
    
                 * 此处将字符串转化为byte数组 
    
                 * 其中值得注意的是,使用UTF-8 编码 
    
                 * 就可以回避因为是非ASCII码被解析成乱码了 
    
                 */
    
                byte[] b = System.Text.Encoding.UTF8.GetBytes(s);
    
                try
                {
    
                    XmlSerializer serializer = GetSerializer(type);
    
                    return serializer.Deserialize(new MemoryStream(b));
    
                }
    
                catch (Exception ex)
                {
    
                    throw ex;
    
                }
    
            } 
    
    
    
    
        }
    }
    
    
  • 相关阅读:
    荷兰国旗问题
    读取文件中数据到数组
    从五个球中选出3个枚举的简单运用
    搜索算法总结
    匿名对象
    欧几里得距离C++代码实现
    用递归法吧字符串S倒序
    利用系统来完成十进制,十六进制,八进制的转换
    DBHelper 使用的是存储过程
    DBHelper的一个小例子
  • 原文地址:https://www.cnblogs.com/linjiancun/p/1879508.html
Copyright © 2011-2022 走看看