源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

.net的序列化与反序列化实例

  • 时间:2020-03-29 03:23 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:.net的序列化与反序列化实例
本文实例讲述了.net的序列化与反序列化的实现方法。分享给大家供大家参考。具体方法如下: [b]1.序列化与反序列化概述[/b] C#中如果需要:将一个结构很复杂的类的对象存储起来,或者通过网路传输到远程的客户端程序中去,这时就需要用到序列化,反序列化(Serialization & Deserialization) [b]2.BinaryFormattter[/b] .NET中串行有三种,BinaryFormatter, SoapFormatter和XmlSerializer. 其中BinaryFormattter最简单,它是直接用二进制方式把对象 (Object)进行串行或反串,他的优点是速度快,可以串行private或者protected的member, 在不同版本的。NET中都兼容,可以看作是。NET自己的本命方法,当然缺点也就随之而来了,离开了。NET它就活不了,所以不能在其他平台或跨网路上进 行。 [b]3.序列化[/b]
[u]复制代码[/u] 代码如下:
BinaryFormatter ser = new BinaryFormatter();   MemoryStream ms = new MemoryStream();   ser.Serialize(ms, DS);   byte[] buffer = ms.ToArray();
  MemoryStream :创建其支持存储区为内存的流 [b]4.反序列化[/b]
[u]复制代码[/u] 代码如下:
//反序列化:将byte[]型的数据,放到Stream中,BinaryFormatter将流中的数据反序列化成对象   MemoryStream ms = new MemoryStream(bytes);   BinaryFormatter ser = new BinaryFormatter();   DataSetSurrogate dss = ser.Deserialize(ms) asDataSetSurrogate;
[b]5.完整实例:[/b]
[u]复制代码[/u] 代码如下:
using System; using System.Collections.Generic; using System.Text; using System.IO.Compression; using System.IO; namespace Common {     /// <summary>     /// 利用GzipStream进行压缩和解压     /// </summary>     public class GZipUtil     {         private static GZipStream gZipStream = null;         /// <summary>         /// 压缩         /// </summary>         /// <param name="srcBytes"></param>         /// <returns></returns>         public static byte[] Compress(byte[] srcBytes)         {             MemoryStream ms = new MemoryStream(srcBytes);             gZipStream = new GZipStream(ms, CompressionMode.Compress);             gZipStream.Write(srcBytes, 0, srcBytes.Length);             gZipStream.Close();             return ms.ToArray();         }         /// <summary>         /// 解压         /// </summary>         /// <param name="srcBytes"></param>         /// <returns></returns>         public static byte[] Decompress(byte[] srcBytes)         {             MemoryStream srcMs = new MemoryStream(srcBytes);             gZipStream = new GZipStream(srcMs, CompressionMode.Decompress);             MemoryStream ms = new MemoryStream();             byte[] buffer = new byte[40960];             int n;             while ((n = gZipStream.Read(buffer, 0, buffer.Length)) > 0)             {                 ms.Write(buffer, 0, n);             }             gZipStream.Close();             return ms.ToArray();         }         /// <summary>         /// 将指定的字节数组压缩,并写入到目标文件         /// </summary>         /// <param name="srcBuffer">指定的源字节数组</param>         /// <param name="destFile">指定的目标文件</param>         public static void CompressData(byte[] srcBuffer, string destFile)         {             FileStream destStream = null;             GZipStream compressedStream = null;             try             {                 //打开文件流                 destStream = new FileStream(destFile, FileMode.OpenOrCreate, FileAccess.Write);                 //指定压缩的目的流(这里是文件流)                 compressedStream = new GZipStream(destStream, CompressionMode.Compress, true);                 //往目的流中写数据,而流将数据写到指定的文件                 compressedStream.Write(srcBuffer, 0, srcBuffer.Length);             }             catch (Exception ex)             {                 throw new Exception(String.Format("压缩数据写入文件{0}时发生错误", destFile), ex);             }             finally             {                 // Make sure we allways close all streams                               if (null != compressedStream)                 {                     compressedStream.Close();                     compressedStream.Dispose();                 }                 if (null != destStream)                     destStream.Close();             }         }         /// <summary>         /// 将指定的文件解压,返回解压后的数据         /// </summary>         /// <param name="srcFile">指定的源文件</param>         /// <returns>解压后得到的数据</returns>         public static byte[] DecompressData(string srcFile)         {             if (false == File.Exists(srcFile))                 throw new FileNotFoundException(String.Format("找不到指定的文件{0}", srcFile));             FileStream sourceStream = null;             GZipStream decompressedStream = null;             byte[] quartetBuffer = null;             try             {                 sourceStream = new FileStream(srcFile, FileMode.Open, FileAccess.Read, FileShare.Read);                 decompressedStream = new GZipStream(sourceStream, CompressionMode.Decompress, true);                 // Read the footer to determine the length of the destiantion file                 //GZIP文件格式说明:                 //10字节的头,包含幻数、版本号以及时间戳                 //可选的扩展头,如原文件名                 //文件体,包括DEFLATE压缩的数据                 //8字节的尾注,包括CRC-32校验和以及未压缩的原始数据长度(4字节) 文件大小不超过4G                 //为Data指定byte的长度,故意开大byte数据的范围                 //读取未压缩的原始数据长度                 quartetBuffer = new byte[4];                 long position = sourceStream.Length - 4;                 sourceStream.Position = position;                 sourceStream.Read(quartetBuffer, 0, 4);                 int checkLength = BitConverter.ToInt32(quartetBuffer, 0);                 byte[] data;                 if (checkLength <= sourceStream.Length)                 {                     data = new byte[Int16.MaxValue];                 }                 else                 {                     data = new byte[checkLength + 100];                 }                 //每100byte从解压流中读出数据,并将读出的数据Copy到Data byte[]中,这样就完成了对数据的解压                 byte[] buffer = new byte[100];                 sourceStream.Position = 0;                 int offset = 0;                 int total = 0;                 while (true)                 {                     int bytesRead = decompressedStream.Read(buffer, 0, 100);                     if (bytesRead == 0)                         break;                     buffer.CopyTo(data, offset);                     offset += bytesRead;                     total += bytesRead;                 }                 //剔除多余的byte                 byte[] actualdata = new byte[total];                 for (int i = 0; i < total; i++)                     actualdata[i] = data[i];                 return actualdata;             }             catch (Exception ex)             {                 throw new Exception(String.Format("从文件{0}解压数据时发生错误", srcFile), ex);             }             finally             {                 if (sourceStream != null)                     sourceStream.Close();                 if (decompressedStream != null)                     decompressedStream.Close();             }         }     } }
[b]6.小结[/b] 进行序列化,反序列化,利用到的都是BinaryFormate,都得借普通流MemoryStream,不同的是: 序列化时,将对象序列化后放到MemoryStream,而反序列化时,将MemoryStream中的byte[]数据,反序列成对象 希望本文所述对大家的C#程序设计有所帮助。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部