C#实现的序列化通用类实例
更新时间:2020年6月25日 11:30 点击:2492
本文实例讲述了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 BinaryFormatter(); using (MemoryStream stream = new MemoryStream()) { bFormatter.Serialize(stream, obj); result = stream.Length; } return result; } /// <summary> /// 克隆一个对象 /// </summary> /// <param name="obj">待克隆的对象</param> /// <returns>克隆的一个新的对象</returns> public static object Clone(object obj) { object cloned = null; BinaryFormatter bFormatter = new BinaryFormatter(); using (MemoryStream memoryStream = new MemoryStream()) { try { bFormatter.Serialize(memoryStream, obj); memoryStream.Seek(0, SeekOrigin.Begin); cloned = bFormatter.Deserialize(memoryStream); } catch //(Exception e) { ; } } return cloned; } /// <summary> /// 从文件中读取文本内容 /// </summary> /// <param name="path">文件路径</param> /// <returns>文件的内容</returns> public static string ReadFile(string path) { string content = string.Empty; using (StreamReader reader = new StreamReader(path)) { content = reader.ReadToEnd(); } return content; } public static byte[] Serialize(object value, out SerializedType type, uint compressionThreshold) { byte[] bytes; if (value is byte[]) { bytes = (byte[])value; type = SerializedType.ByteArray; if (bytes.Length > compressionThreshold) { bytes = compress(bytes); type = SerializedType.CompressedByteArray; } } else if (value is string) { bytes = Encoding.UTF8.GetBytes((string)value); type = SerializedType.String; if (bytes.Length > compressionThreshold) { bytes = compress(bytes); type = SerializedType.CompressedString; } } else if (value is DateTime) { bytes = BitConverter.GetBytes(((DateTime)value).Ticks); type = SerializedType.Datetime; } else if (value is bool) { bytes = new byte[] { (byte)((bool)value ? 1 : 0) }; type = SerializedType.Bool; } else if (value is byte) { bytes = new byte[] { (byte)value }; type = SerializedType.Byte; } else if (value is short) { bytes = BitConverter.GetBytes((short)value); type = SerializedType.Short; } else if (value is ushort) { bytes = BitConverter.GetBytes((ushort)value); type = SerializedType.UShort; } else if (value is int) { bytes = BitConverter.GetBytes((int)value); type = SerializedType.Int; } else if (value is uint) { bytes = BitConverter.GetBytes((uint)value); type = SerializedType.UInt; } else if (value is long) { bytes = BitConverter.GetBytes((long)value); type = SerializedType.Long; } else if (value is ulong) { bytes = BitConverter.GetBytes((ulong)value); type = SerializedType.ULong; } else if (value is float) { bytes = BitConverter.GetBytes((float)value); type = SerializedType.Float; } else if (value is double) { bytes = BitConverter.GetBytes((double)value); type = SerializedType.Double; } else { //Object using (MemoryStream ms = new MemoryStream()) { new BinaryFormatter().Serialize(ms, value); bytes = ms.GetBuffer(); type = SerializedType.Object; if (bytes.Length > compressionThreshold) { bytes = compress(bytes); type = SerializedType.CompressedObject; } } } return bytes; } private static byte[] compress(byte[] bytes) { using (MemoryStream ms = new MemoryStream()) { using (DeflateStream gzs = new DeflateStream(ms, CompressionMode.Compress, false)) { gzs.Write(bytes, 0, bytes.Length); } ms.Close(); return ms.GetBuffer(); } } private static byte[] decompress(byte[] bytes) { using (MemoryStream ms = new MemoryStream(bytes, false)) { using (DeflateStream gzs = new DeflateStream(ms, CompressionMode.Decompress, false)) { using (MemoryStream dest = new MemoryStream()) { byte[] tmp = new byte[bytes.Length]; int read; while ((read = gzs.Read(tmp, 0, tmp.Length)) != 0) { dest.Write(tmp, 0, read); } dest.Close(); return dest.GetBuffer(); } } } } public static object DeSerialize(byte[] bytes, SerializedType type) { switch (type) { case SerializedType.String: return Encoding.UTF8.GetString(bytes); case SerializedType.Datetime: return new DateTime(BitConverter.ToInt64(bytes, 0)); case SerializedType.Bool: return bytes[0] == 1; case SerializedType.Byte: return bytes[0]; case SerializedType.Short: return BitConverter.ToInt16(bytes, 0); case SerializedType.UShort: return BitConverter.ToUInt16(bytes, 0); case SerializedType.Int: return BitConverter.ToInt32(bytes, 0); case SerializedType.UInt: return BitConverter.ToUInt32(bytes, 0); case SerializedType.Long: return BitConverter.ToInt64(bytes, 0); case SerializedType.ULong: return BitConverter.ToUInt64(bytes, 0); case SerializedType.Float: return BitConverter.ToSingle(bytes, 0); case SerializedType.Double: return BitConverter.ToDouble(bytes, 0); case SerializedType.Object: using (MemoryStream ms = new MemoryStream(bytes)) { return new BinaryFormatter().Deserialize(ms); } case SerializedType.CompressedByteArray: return DeSerialize(decompress(bytes), SerializedType.ByteArray); case SerializedType.CompressedString: return DeSerialize(decompress(bytes), SerializedType.String); case SerializedType.CompressedObject: return DeSerialize(decompress(bytes), SerializedType.Object); case SerializedType.ByteArray: default: return bytes; } } } }
希望本文所述对大家的C#程序设计有所帮助。
上一篇: C#图像处理之浮雕效果实现方法
相关文章
- 我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
- 这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
- 这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
- 本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
- 这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
- 本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)
这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25- 这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
- 这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
- 最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
- 这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
- 本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
- 轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
- 本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
- 这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
- 这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
- 下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25