对象序列化工具

来源:互联网 发布:阿里云企业邮箱地址 编辑:程序博客网 时间:2024/04/28 21:53

对象类的序列化轻型的XML和复杂型的byte[]方式


    /// <summary>    /// 对象序列化工具    /// </summary>    public class ObjectSerializationHelper    {        /// <summary>        /// 序列化集合        /// </summary>        private static Dictionary<int, XmlSerializer> xmlSerializer_dict = new Dictionary<int, XmlSerializer>();        #region --- Functions Begin ---        /// <summary>        /// 获取对象类型的序列化Xml格式        /// </summary>        /// <typeparam name="T">对象类型</typeparam>        /// <returns>Xml格式</returns>        private static XmlSerializer GetXmlSerializer<T>() where T : new()        {            int tHash = typeof(T).GetHashCode();            if (!xmlSerializer_dict.ContainsKey(tHash))            {                xmlSerializer_dict.Add(tHash, new XmlSerializer(typeof(T)));            }            return xmlSerializer_dict[tHash];        }        /// <summary>        /// 把对象序列化为字符串        /// </summary>        /// <typeparam name="T">对象类型</typeparam>        /// <param name="t">对象</param>        /// <returns>序列化后的字符串,失败则会抛出异常信息</returns>        public static string SerializeToXmlString<T>(T t) where T : new()        {            string str = string.Empty;            XmlSerializer xml = GetXmlSerializer<T>();            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;                xml.Serialize(xtw, t);                ms.Seek(0, SeekOrigin.Begin);                sr = new StreamReader(ms);                str = sr.ReadToEnd();            }            catch (Exception ex)            {                throw ex;            }            finally            {                if (xtw != null)                    xtw.Close();                if (sr != null)                    sr.Close();                ms.Close();            }            return str;        }        /// <summary>        /// 从字符窜反序列化为对象        /// </summary>        /// <typeparam name="T">对象类</typeparam>        /// <param name="s">需要反序列化的字符串</param>        /// <returns>该对象实例,失败则会抛出异常信息</returns>        public static T DeSerializeForXmlString<T>(string s) where T : new()        {            byte[] bArray = System.Text.Encoding.UTF8.GetBytes(s);            try            {                XmlSerializer xml = GetXmlSerializer<T>();                return (T)xml.Deserialize(new MemoryStream(bArray));            }            catch (Exception ex)            {                throw ex;            }        }        /// <summary>        /// 对象序列化为Byte数组        /// </summary>        /// <typeparam name="T">对象类</typeparam>        /// <param name="t">来源对象</param>        /// <returns>返回结果</returns>        public static byte[] SerializeToBytes<T>(T t) where T : new()        {            using (MemoryStream stream = new MemoryStream())            {                try                {                    byte[] buf = null;                    IFormatter formatter = new BinaryFormatter();                    formatter.Serialize(stream, t);                    buf = stream.ToArray();                    stream.Close();                    return buf;                }                catch (Exception ex)                {                    throw ex;                }            }        }        /// <summary>        /// 序列化为Byte数组对象还原为对象实体        /// </summary>        /// <typeparam name="T">对象类型</typeparam>        /// <param name="buf">对象序列化后数据</param>        /// <returns></returns>        public static T DeSerializeForBytes<T>(byte[] buf) where T : new()        {            try            {                using (MemoryStream stream = new MemoryStream(buf))                {                    IFormatter formatter = new BinaryFormatter();                    return (T)formatter.Deserialize(stream);                }            }            catch (Exception ex)            {                throw ex;            }        }        /// <summary>        /// 简单克隆利用Xml模式进行序列化克隆        /// </summary>        /// <typeparam name="T">对象类型</typeparam>        /// <param name="obj">对象实体</param>        /// <returns>对象副本</returns>        public static T SimpleClone<T>(T obj) where T : new()        {            try            {                string xmlString = SerializeToXmlString(obj);                return DeSerializeForXmlString<T>(xmlString);            }            catch (Exception ex)            {                throw ex;            }        }        /// <summary>        /// 高级克隆利用内存流模式进行序列化克隆        /// </summary>        /// <typeparam name="T">对象类型</typeparam>        /// <param name="obj">对象实体</param>        /// <returns>对象副本</returns>        public static T AdvancedClone<T>(T obj) where T : new()        {            try            {                byte[] buf = SerializeToBytes(obj);                return DeSerializeForBytes<T>(buf);            }            catch (Exception ex)            {                throw ex;            }        }        /*        /// <summary>        /// 克隆对象        /// </summary>        public static class ObjectCloner        {            /// <summary>            /// 克隆对象            /// </summary>            /// <param name="obj">需要克隆的对象</param>            /// <returns>返回当前对象的克隆对象</returns>            public static T Clone<T>(T obj) where T : new()            {                try                {                    using (MemoryStream stream = new MemoryStream())                    {                        BinaryFormatter formatter = new BinaryFormatter();                        formatter.Serialize(stream, obj);                        stream.Position = 0L;                        return (T)formatter.Deserialize(stream);                    }                }                catch (Exception ex)                {                    throw ex;                }            }        }        */        #endregion --- Functions End ---    }




原创粉丝点击