zoukankan      html  css  js  c++  java
  • C#序列化总结

    贴一下自己序列化的代码:

     public class XMLUtil
        {
            /// <summary>
            /// XML & Datacontract Serialize & Deserialize Helper
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="serialObject"></param>
            /// <returns></returns>
            public static string Serializer<T>(T serialObject) where T : class
            {
                string result = string.Empty;
                using (MemoryStream mem = new MemoryStream())
                {
                    using (XmlTextWriter writer = new XmlTextWriter(mem, Encoding.UTF8))
                    {
                        System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(T));
                        ser.Serialize(writer, serialObject);
                        result = Encoding.UTF8.GetString(mem.ToArray());
                    }
                }
                return result;
            }
    
            public static T Deserialize<T>(string str) where T : class
            {
                T result = null;
                using (MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(str)))
                {
                    using (StreamReader streamReader = new StreamReader(memoryStream))
                    {
                        System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer(typeof(T));
                        result = (T)xmlSerializer.Deserialize(memoryStream);
                    }
                }
                return result;
            }
        }

    上面的写法持续序列化不会有内存溢出的性能问题,之前一直被告知直接引用公司某位老鸟封装好的dll来序列化,后来发现了老是出现内存溢出,贴一下它的错误写法,仅供吸取教训:

    public class XMLUtil
        {
            /// <summary>
            /// XML & Datacontract Serialize & Deserialize Helper
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="serialObject"></param>
            /// <returns></returns>
            public static string Serializer<T>(T serialObject) where T : class
            {
                //try
                //{
                XmlSerializer ser = new XmlSerializer(typeof(T));
                System.IO.MemoryStream mem = new MemoryStream();
                XmlTextWriter writer = new XmlTextWriter(mem, Encoding.UTF8);
                ser.Serialize(writer, serialObject);
                writer.Close();
    
                return Encoding.UTF8.GetString(mem.ToArray());
                //}
                //catch (Exception ex)
                //{
                //    return null;
                //}
            }
    
            public static T Deserialize<T>(string str) where T : class
            {
                //try
                //{
                XmlSerializer mySerializer = new XmlSerializer(typeof(T));
                StreamReader mem2 = new StreamReader(
                        new MemoryStream(System.Text.Encoding.UTF8.GetBytes(str)),
                        System.Text.Encoding.UTF8);
    
                return (T)mySerializer.Deserialize(mem2);
                //}
                //catch (Exception)
                //{
                //    return null;
                //}
            }
    
            //public static string Json_SerializeObject(object value)
            //{
            //    return Newtonsoft.Json.JsonConvert.SerializeObject(value);
            //}
            //public static object Json_DeserializeObject(string value)
            //{
            //    return Newtonsoft.Json.JsonConvert.DeserializeObject(value);
            //}
            //public static T Json_DeserializeObject<T>(string value)
            //{
            //    return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(value);
            //}
        }

    哎,老鸟赶时间的时候写代码吧,直接放内存里,流都忘记释放了。。。

  • 相关阅读:
    PID控制原理和算法
    Android 按钮长按下去重复执行某个动作,放开后停止执行动作
    最小二乘法拟合非线性函数及其Matlab/Excel 实现
    Android 基于蓝牙的方向控制器
    Android/Java 中的 String, StringBuffer, StringBuilder的区别和使用
    input 只允许输入数字
    java scoket编程
    RBAC权限管理
    整理大型网站架构必知必会的几个服务器知识
    Java中Class<T>与Class<?>的区别
  • 原文地址:https://www.cnblogs.com/lelehellow/p/7284470.html
Copyright © 2011-2022 走看看