gogo 通过本文主要向大家介绍了c#json序列化,c#xml序列化,c#反序列化,c#对象序列化,c#序列化和反序列化等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
本文实例讲述了C#实现的序列化通用类。分享给大家供大家参考。具体如下:
using System; using System.IO; using System.IO.Compression; using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization.Formatters.Soap; using System.Text; using System.Xml; using System.Xml.Serialization; namespace PlatForm.Utilities { public enum SerializedType : ushort { ByteArray = 0, Object = 1, String = 2, Datetime = 3, Bool = 4, //SByte = 5, //Makes no sense. Byte = 6, Short = 7, UShort = 8, Int = 9, UInt = 10, Long = 11, ULong = 12, Float = 13, Double = 14, CompressedByteArray = 255, CompressedObject = 256, CompressedString = 257, } public class SerializeHelper { public SerializeHelper() { } #region XML序列化 /// <summary> /// 文件化XML序列化 /// </summary> /// <param name="obj">对象</param> /// <param name="filename">文件路径</param> 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(); } } /// <summary> /// 文件化XML反序列化 /// </summary> /// <param name="type">对象类型</param> /// <param name="filename">文件路径</param> 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(); } } /// <summary> /// 文本化XML序列化 /// </summary> /// <param name="item">对象</param> public string ToXml<T>(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(); } } /// <summary> /// 文本化XML反序列化 /// </summary> /// <param name="str">字符串序列</param> public T FromXml<T>(string str) { XmlSerializer serializer = new XmlSerializer(typeof(T)); using (XmlReader reader = new XmlTextReader(new StringReader(str))) { return (T)serializer.Deserialize(reader); } } #endregion #region SoapFormatter序列化 /// <summary> /// SoapFormatter序列化 /// </summary> /// <param name="item">对象</param> public static string ToSoap<T>(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; } } /// <summary> /// SoapFormatter反序列化 /// </summary> /// <param name="str">字符串序列</param> public static T FromSoap<T>(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序列化 /// <summary> /// BinaryFormatter序列化 /// </summary> /// <param name="item">对象</param> public static string ToBinary<T>(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(); } } /// <summary> /// BinaryFormatter反序列化 /// </summary> /// <param name="str">字符串序列</param> public static T FromBinary<T>(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 /// <summary> /// 将对象序列化为二进制字节 /// </summary> /// <param name="obj">待序列化的对象</param> /// <returns></returns> public static byte[] SerializeToBinary(object obj) { byte[] bytes = new byte[2500]; using (MemoryStream memoryStream = new MemoryStream()) { BinaryFormatter bformatter = new BinaryFormatter(); bformatter.Serialize(memoryStream, obj); memoryStream.Seek(0, 0); if (memoryStream.Length > bytes.Length) { bytes = new byte[memoryStream.Length]; } bytes = memoryStream.ToArray(); } return bytes; } /// <summary> /// 从二进制字节中反序列化为对象 /// </summary> /// <param name="type">对象的类型</param> /// <param name="bytes">字节数组</param> /// <returns>反序列化后得到的对象</returns> public static object DeserializeFromBinary(Type type, byte[] bytes) { object result = new object(); using (MemoryStream memoryStream = new MemoryStream(bytes)) { BinaryFormatter serializer = new BinaryFormatter(); result = serializer.Deserialize(memoryStream); } return result; } /// <summary> /// 将文件对象序列化到文件中 /// </summary> /// <param name="obj">待序列化的对象</param> /// <param name="path">文件路径</param> /// <param name="fileMode">文件打开模式</param> public static void SerializeToBinary(object obj, string path, FileMode fileMode) { using (FileStream fs = new FileStream(path, fileMode)) { // Construct a BinaryFormatter and use it to serialize the data to the stream. BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(fs, obj); } } /// <summary> /// 将文件对象序列化到文件中 /// </summary> /// <param name="obj">待序列化的对象</param> /// <param name="path">文件路径</param> public static void SerializeToBinary(object obj, string path) { SerializeToBinary(obj, path, FileMode.Create); } /// <summary> /// 从二进制文件中反序列化为对象 /// </summary> /// <param name="type">对象的类型</param> /// <param name="path">二进制文件路径</param> /// <returns>反序列化后得到的对象</returns> public static object DeserializeFromBinary(Type type, string path) { object result = new object(); using (FileStream fileStream = new FileStream(path, FileMode.Open)) { BinaryFormatter serializer = new BinaryFormatter(); result = serializer.Deserialize(fileStream); } return result; } /// <summary> /// 获取对象的转换为二进制的字节大小 /// </summary> /// <param name="obj"></param> /// <returns></returns> public static long GetByteSize(object obj) { long result; BinaryFormatter bFormatter = new BinaryForma