using System; using System.IO; using System.Text; using System.Xml; using System.Xml.Serialization; //using System.Runtime.Serialization.Json; using System.Runtime.Serialization.Formatters.Soap; using System.Runtime.Serialization.Formatters.Binary; namespace ViewWindow.Config { public class SerializeHelper { public SerializeHelper() { } #region XML序列化 /// /// 文件化XML序列化 /// /// 对象 /// 文件路径 public static void Save(object obj, string filename) { FileStream fs = null; try { fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.ReadWrite); XmlSerializer serializer = new XmlSerializer(obj.GetType()); serializer.Serialize(fs, obj); } catch (Exception ex) { throw ex; } finally { if (fs != null) fs.Close(); } } /// /// 文件化XML反序列化 /// /// 对象类型 /// 文件路径 public static object Load(Type type, string filename) { FileStream fs = null; try { fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); XmlSerializer serializer = new XmlSerializer(type); return serializer.Deserialize(fs); } catch (Exception ex) { throw ex; } finally { if (fs != null) fs.Close(); } } /// /// 文本化XML序列化 /// /// 对象 public string ToXml(T item) { XmlSerializer serializer = new XmlSerializer(item.GetType()); StringBuilder sb = new StringBuilder(); using (XmlWriter writer = XmlWriter.Create(sb)) { serializer.Serialize(writer, item); return sb.ToString(); } } /// /// 文本化XML反序列化 /// /// 字符串序列 public T FromXml(string str) { XmlSerializer serializer = new XmlSerializer(typeof(T)); using (XmlReader reader = new XmlTextReader(new StringReader(str))) { return (T)serializer.Deserialize(reader); } } #endregion #region Json序列化 /// /// JsonSerializer序列化 /// /// 对象 //public string ToJson(T item) //{ // DataContractJsonSerializer serializer = new DataContractJsonSerializer(item.GetType()); // using (MemoryStream ms = new MemoryStream()) // { // serializer.WriteObject(ms, item); // return Encoding.UTF8.GetString(ms.ToArray()); // } //} ///// ///// JsonSerializer反序列化 ///// ///// 字符串序列 //public T FromJson(string str) where T : class //{ // DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T)); // using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(str))) // { // return serializer.ReadObject(ms) as T; // } //} #endregion #region SoapFormatter序列化 /// /// SoapFormatter序列化 /// /// 对象 public string ToSoap(T item) { SoapFormatter formatter = new SoapFormatter(); using (MemoryStream ms = new MemoryStream()) { formatter.Serialize(ms, item); ms.Position = 0; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(ms); return xmlDoc.InnerXml; } } /// /// SoapFormatter反序列化 /// /// 字符串序列 public T FromSoap(string str) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(str); SoapFormatter formatter = new SoapFormatter(); using (MemoryStream ms = new MemoryStream()) { xmlDoc.Save(ms); ms.Position = 0; return (T)formatter.Deserialize(ms); } } #endregion #region BinaryFormatter序列化 /// /// BinaryFormatter序列化 /// /// 对象 public string ToBinary(T item) { BinaryFormatter formatter = new BinaryFormatter(); using (MemoryStream ms = new MemoryStream()) { formatter.Serialize(ms, item); ms.Position = 0; byte[] bytes = ms.ToArray(); StringBuilder sb = new StringBuilder(); foreach (byte bt in bytes) { sb.Append(string.Format("{0:X2}", bt)); } return sb.ToString(); } } /// /// BinaryFormatter反序列化 /// /// 字符串序列 public T FromBinary(string str) { int intLen = str.Length / 2; byte[] bytes = new byte[intLen]; for (int i = 0; i < intLen; i++) { int ibyte = Convert.ToInt32(str.Substring(i * 2, 2), 16); bytes[i] = (byte)ibyte; } BinaryFormatter formatter = new BinaryFormatter(); using (MemoryStream ms = new MemoryStream(bytes)) { return (T)formatter.Deserialize(ms); } } #endregion /// /// 获取对象序列化的二进制版本 /// /// 对象实体 /// 如果对象实体为Null,则返回结果为Null。 public static byte[] GetBytes(object pObj) { if (pObj == null) { return null; } MemoryStream serializationStream = new MemoryStream(); new BinaryFormatter().Serialize(serializationStream, pObj); serializationStream.Position = 0L; byte[] buffer = new byte[serializationStream.Length]; serializationStream.Read(buffer, 0, buffer.Length); serializationStream.Close(); return buffer; } /// /// 获取对象序列化的XmlDocument版本 /// /// 对象实体 /// 如果对象实体为Null,则返回结果为Null。 public static XmlDocument GetXmlDoc(object pObj) { if (pObj == null) { return null; } XmlSerializer serializer = new XmlSerializer(pObj.GetType()); StringBuilder sb = new StringBuilder(); StringWriter writer = new StringWriter(sb); serializer.Serialize((TextWriter)writer, pObj); XmlDocument document = new XmlDocument(); document.LoadXml(sb.ToString()); writer.Close(); return document; } /// /// 从已序列化数据中(byte[])获取对象实体 /// /// 要返回的数据类型 /// 二进制数据 /// 对象实体 public static T GetObject(byte[] binData) { if (binData == null) { return default(T); } BinaryFormatter formatter = new BinaryFormatter(); MemoryStream serializationStream = new MemoryStream(binData); return (T)formatter.Deserialize(serializationStream); } /// /// 从已序列化数据(XmlDocument)中获取对象实体 /// /// 要返回的数据类型 /// 已序列化的文档对象 /// 对象实体 public static T GetObject(XmlDocument xmlDoc) { if (xmlDoc == null) { return default(T); } XmlNodeReader xmlReader = new XmlNodeReader(xmlDoc.DocumentElement); XmlSerializer serializer = new XmlSerializer(typeof(T)); return (T)serializer.Deserialize(xmlReader); } } }