亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#實現的序列化通用類實例

2020-01-24 01:55:34
字體:
來源:轉載
供稿:網友

本文實例講述了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#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品扒开腿做爽爽爽的视频| 狠狠操狠狠色综合网| 欧美精品九九久久| 97avcom| 国产精品视频一区二区高潮| 97人人做人人爱| 欧美劲爆第一页| 国产精品九九久久久久久久| 亚洲欧洲免费视频| 久久国产精品久久国产精品| 日韩视频第一页| 国产一区二区三区在线视频| 亚洲性69xxxbbb| 久久久免费av| 国产欧美精品日韩精品| 亚洲电影免费观看高清完整版在线观看| 久久久国产视频91| 国产一区在线播放| 亚洲新中文字幕| 亚洲福利精品在线| 在线观看精品国产视频| 国产成人综合亚洲| 欧美乱大交xxxxx另类电影| 久久视频中文字幕| 在线看欧美日韩| 日韩最新中文字幕电影免费看| 欧美最顶级丰满的aⅴ艳星| 日韩欧美精品网站| 国产成人在线视频| 欧美午夜视频一区二区| 91午夜理伦私人影院| 亚洲人成电影网站色…| 亚洲电影免费观看高清完整版| 日本午夜精品理论片a级appf发布| 亚洲自拍偷拍网址| 98精品国产自产在线观看| 国语自产精品视频在线看| 亚洲精品成人久久| 国产精品日本精品| 亚洲国产精品资源| xx视频.9999.com| 色综合天天狠天天透天天伊人| 欧美日韩一区二区三区| 亚洲欧美国产另类| 精品视频中文字幕| 最近中文字幕2019免费| 精品福利免费观看| 91久久久久久久一区二区| 亚洲精品久久久久国产| 欧美亚洲视频在线看网址| 韩国v欧美v日本v亚洲| 国产精品国产三级国产aⅴ9色| 日日狠狠久久偷偷四色综合免费| 亚洲第一中文字幕在线观看| 欧美激情国产高清| 日韩高清a**址| 欧美激情国产高清| 亚洲成人久久久久| 国产一区私人高清影院| 另类专区欧美制服同性| 亚洲欧美三级在线| 欧美一级高清免费播放| 日韩在线欧美在线国产在线| 91tv亚洲精品香蕉国产一区7ujn| 国产在线视频2019最新视频| 日韩经典第一页| 欧美激情第一页xxx| 久久天天躁狠狠躁夜夜av| 国产成人97精品免费看片| 美女久久久久久久| 亚洲男人av在线| 亚洲精品久久久久国产| 日韩av网址在线| 在线观看欧美日韩| 91精品国产乱码久久久久久久久| 中文字幕亚洲欧美| 亚洲最大在线视频| 久久久999精品视频| 日韩有码在线观看| 亚洲国模精品一区| 麻豆一区二区在线观看| 欧美一区二区三区图| 97超级碰碰人国产在线观看| 日韩精品在线观看一区二区| 精品中文字幕乱| 久操成人在线视频| 在线观看久久av| 精品国产精品三级精品av网址| 亚洲成人精品视频在线观看| 国产精品久久综合av爱欲tv| 一区二区福利视频| 国产精品一区=区| 国产一区二区三区视频免费| 成人网页在线免费观看| 成人xxxxx| 日韩在线欧美在线| 亚洲精品久久久久中文字幕欢迎你| 精品人伦一区二区三区蜜桃网站| 国产精品一区=区| 亚洲国产精品美女| 国产精品电影久久久久电影网| www.国产一区| 亚洲第一av网站| 欧美另类第一页| 国产日产欧美a一级在线| 国产成人jvid在线播放| 日韩av大片在线| 亚洲性视频网站| 98精品国产高清在线xxxx天堂| 亚洲国产精品一区二区久| 亚洲最大av网| 91在线观看免费高清| 国产精品视频在线播放| 91在线视频九色| 97av在线影院| 久久久国产视频91| 国产综合福利在线| 国产精品视频自拍| 日韩精品免费在线视频| 欧美日韩亚洲天堂| 另类色图亚洲色图| 91av在线精品| 亚洲欧美999| 日韩在线观看视频免费| 久久久免费观看视频| 欧美大尺度电影在线观看| 中文字幕亚洲在线| 欧美一区二区色| 色午夜这里只有精品| 欧美主播福利视频| 国产精品劲爆视频| 国产欧美韩国高清| 奇米4444一区二区三区| 亚洲毛片在线观看.| 日韩精品在线观看一区二区| 精品国产一区二区在线| 亚洲激情在线观看视频免费| 国产精品男女猛烈高潮激情| 九九久久综合网站| 国产精品爽爽爽| 成人性生交xxxxx网站| 成人动漫网站在线观看| 国产精品第100页| 97视频在线观看免费高清完整版在线观看| 国产91精品久久久久久久| 欧美在线精品免播放器视频| 久久99热这里只有精品国产| 78色国产精品| 国产精品久久久久久网站| 亚洲第一网站男人都懂| 久久精品亚洲94久久精品| 韩剧1988免费观看全集| 欧美大尺度电影在线观看| 2019中文字幕免费视频| 欧美激情亚洲精品| 亚洲欧美综合另类中字| 精品日本高清在线播放| 久久99精品久久久久久青青91| 国产亚洲精品久久久优势| 国产精品午夜视频| 中文字幕亚洲激情| 日本精品久久中文字幕佐佐木| 精品国产91久久久久久| 91系列在线播放|