c# - Serialize and Deserialize, 序列化 反序列化 泛型

来源:互联网 发布:淘宝ted baker 编辑:程序博客网 时间:2024/05/22 14:38
using Newtonsoft.Json;using System.IO;using System.Runtime.Serialization;using System.Runtime.Serialization.Formatters.Binary;using System.Xml.Serialization;namespace Cano.ToolSet{    public class Serializer    {        #region 序列化,反序列化 - Byte[]        public static byte[] SerializeBytes<T>(T obj)        {            MemoryStream stream = new MemoryStream();            IFormatter formatter = new BinaryFormatter();            formatter.Serialize(stream, obj);            return stream.ToArray();        }        public static T DeSerializeBytes<T>(byte[] bytes)        {            MemoryStream stream = new MemoryStream(bytes);            IFormatter formatter = new BinaryFormatter();            stream.Seek(0, SeekOrigin.Begin);            T o = (T)formatter.Deserialize(stream);            return o;        }        #endregion        #region 序列化,反序列化 - MemoryStream        public static MemoryStream SerializeStream<T>(T obj)        {            MemoryStream stream = new MemoryStream();            IFormatter formatter = new BinaryFormatter();            formatter.Serialize(stream, obj);            return stream;        }        public static T DeSerializeStream<T>(MemoryStream stream)        {            IFormatter formatter = new BinaryFormatter();            stream.Seek(0, SeekOrigin.Begin);            T o = (T)formatter.Deserialize(stream);            return o;        }        public static T DeSerializeStreamFile<T>(string memFile)        {            MemoryStream stream = ReadFileToMemoryStream(memFile);            return DeSerializeStream<T>(stream);        }        public static void SerializeStreamFile<T>(T obj, string memFile)        {            MemoryStream stream = SerializeStream<T>(obj);            WriteMemoryStreamToFile(stream, memFile);        }        private static void WriteMemoryStreamToFile(MemoryStream stream, string file)        {            using (FileStream fs = new FileStream(file, FileMode.Create, System.IO.FileAccess.Write))            {                stream.WriteTo(fs);            }        }        private static MemoryStream ReadFileToMemoryStream(string file)        {            using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))            {                byte[] bytes = new byte[fs.Length];                fs.Read(bytes, 0, (int)fs.Length);                MemoryStream ms = new MemoryStream(bytes);                return ms;            }        }        #endregion        #region 序列化,反序列化 - Xml File        public static void SerializeXMLFile<T>(T obj, string xmlpath)        {            XmlSerializer serializer = new XmlSerializer(typeof(T));            using (StreamWriter writer = new StreamWriter(xmlpath))            {                serializer.Serialize(writer, obj);                writer.Close();            }        }        public static T DeserializeXMLFile<T>(string xmlPath)        {            XmlSerializer deserializer = new XmlSerializer(typeof(T));            using (StreamReader reader = new StreamReader(xmlPath))            {                T obj = (T)deserializer.Deserialize(reader);                reader.Close();                return obj;            }        }        #endregion        #region 序列化,反序列化 - XML String        public static string SerializeXML<T>(T obj)        {            XmlSerializer serializer = new XmlSerializer(typeof(T));            string content = string.Empty;            using (StringWriter writer = new StringWriter())            {                serializer.Serialize(writer, obj);                content = writer.ToString();            }            return content;        }        public static T DeserializeXML<T>(string content)        {            XmlSerializer deserializer = new XmlSerializer(typeof(T));            using (StringReader reader = new StringReader(content))            {                T obj = (T)deserializer.Deserialize(reader);                reader.Close();                return obj;            }        }        #endregion        #region 序列化,反序列化 - Json String        public static string SerializeJSON<T>(T obj)        {            return JsonConvert.SerializeObject(obj);        }        public static T DeserializeJSON<T>(string content)        {            return JsonConvert.DeserializeObject<T>(content);        }        #endregion    }}


Xml CDATA support:

[Serializable]    public class PropertyEngineConfig    {        public PropertyEngineConfig()        {            Items = new NodeType();        }        [XmlIgnore]        public IEnumerable<long> ItemsParsed         {             get             {                if (!string.IsNullOrWhiteSpace(Items.Content))                 {                    return this.<span style="font-family: Arial, Helvetica, sans-serif;">Items</span>.Content.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries).Select(i => long.Parse(i));                }                return null;            }            private set { }        }        public NodeType Items { get; set; }    }    public class NodeType    {        [XmlIgnore]        public string Content { get; set; }        [XmlText]        public XmlNode[] CDataContent        {            get            {                var dummy = new XmlDocument();                return new XmlNode[] { dummy.CreateCDataSection(Content) };            }            set            {                if (value == null)                {                    Content = null;                    return;                }                if (value.Length != 1)                {                    throw new InvalidOperationException(                        String.Format(                            "Invalid array length {0}", value.Length));                }                Content = value[0].Value;            }        }    }

生成的Xml如下:

<PropertyEngineConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">  <Items><![CDATA[123,234]]></Items></PropertyEngineConfig>

如果想使用Json序列化相关的函数,需要在nuget中安装Newtonsoft.Json,安装之后packages.config如下:

<?xml version="1.0" encoding="utf-8"?><packages>  <package id="Newtonsoft.Json" version="8.0.2" targetFramework="net45" /></packages>

代码在此:https://github.com/yuxuac/Cano