.net的序列化与反序列化实例
本文实例讲述了.net的序列化与反序列化的实现方法。分享给大家供大家参考。具体方法如下:
1.序列化与反序列化概述
C#中如果需要:将一个结构很复杂的类的对象存储起来,或者通过网路传输到远程的客户端程序中去,这时就需要用到序列化,反序列化(Serialization&Deserialization)
2.BinaryFormattter
.NET中串行有三种,BinaryFormatter,SoapFormatter和XmlSerializer.
其中BinaryFormattter最简单,它是直接用二进制方式把对象(Object)进行串行或反串,他的优点是速度快,可以串行private或者protected的member,在不同版本的。NET中都兼容,可以看作是。NET自己的本命方法,当然缺点也就随之而来了,离开了。NET它就活不了,所以不能在其他平台或跨网路上进行。
3.序列化
BinaryFormatterser=newBinaryFormatter(); MemoryStreamms=newMemoryStream(); ser.Serialize(ms,DS); byte[]buffer=ms.ToArray();
MemoryStream:创建其支持存储区为内存的流
4.反序列化
//反序列化:将byte[]型的数据,放到Stream中,BinaryFormatter将流中的数据反序列化成对象 MemoryStreamms=newMemoryStream(bytes); BinaryFormatterser=newBinaryFormatter(); DataSetSurrogatedss=ser.Deserialize(ms)asDataSetSurrogate;
5.完整实例:
usingSystem; usingSystem.Collections.Generic; usingSystem.Text; usingSystem.IO.Compression; usingSystem.IO;
namespaceCommon { ///<summary> ///利用GzipStream进行压缩和解压 ///</summary> publicclassGZipUtil { privatestaticGZipStreamgZipStream=null; ///<summary> ///压缩 ///</summary> ///<paramname="srcBytes"></param> ///<returns></returns> publicstaticbyte[]Compress(byte[]srcBytes) { MemoryStreamms=newMemoryStream(srcBytes); gZipStream=newGZipStream(ms,CompressionMode.Compress); gZipStream.Write(srcBytes,0,srcBytes.Length); gZipStream.Close(); returnms.ToArray(); } ///<summary> ///解压 ///</summary> ///<paramname="srcBytes"></param> ///<returns></returns> publicstaticbyte[]Decompress(byte[]srcBytes) { MemoryStreamsrcMs=newMemoryStream(srcBytes); gZipStream=newGZipStream(srcMs,CompressionMode.Decompress); MemoryStreamms=newMemoryStream(); byte[]buffer=newbyte[40960]; intn; while((n=gZipStream.Read(buffer,0,buffer.Length))>0) { ms.Write(buffer,0,n); } gZipStream.Close(); returnms.ToArray(); }
///<summary> ///将指定的字节数组压缩,并写入到目标文件 ///</summary> ///<paramname="srcBuffer">指定的源字节数组</param> ///<paramname="destFile">指定的目标文件</param> publicstaticvoidCompressData(byte[]srcBuffer,stringdestFile) { FileStreamdestStream=null; GZipStreamcompressedStream=null; try { //打开文件流 destStream=newFileStream(destFile,FileMode.OpenOrCreate,FileAccess.Write); //指定压缩的目的流(这里是文件流) compressedStream=newGZipStream(destStream,CompressionMode.Compress,true); //往目的流中写数据,而流将数据写到指定的文件 compressedStream.Write(srcBuffer,0,srcBuffer.Length); } catch(Exceptionex) { thrownewException(String.Format("压缩数据写入文件{0}时发生错误",destFile),ex); } finally { //Makesureweallwayscloseallstreams if(null!=compressedStream) { compressedStream.Close(); compressedStream.Dispose(); }
if(null!=destStream) destStream.Close(); } } ///<summary> ///将指定的文件解压,返回解压后的数据 ///</summary> ///<paramname="srcFile">指定的源文件</param> ///<returns>解压后得到的数据</returns> publicstaticbyte[]DecompressData(stringsrcFile) { if(false==File.Exists(srcFile)) thrownewFileNotFoundException(String.Format("找不到指定的文件{0}",srcFile)); FileStreamsourceStream=null; GZipStreamdecompressedStream=null; byte[]quartetBuffer=null; try { sourceStream=newFileStream(srcFile,FileMode.Open,FileAccess.Read,FileShare.Read);
decompressedStream=newGZipStream(sourceStream,CompressionMode.Decompress,true);
//Readthefootertodeterminethelengthofthedestiantionfile //GZIP文件格式说明: //10字节的头,包含幻数、版本号以及时间戳 //可选的扩展头,如原文件名 //文件体,包括DEFLATE压缩的数据 //8字节的尾注,包括CRC-32校验和以及未压缩的原始数据长度(4字节)文件大小不超过4G
//为Data指定byte的长度,故意开大byte数据的范围 //读取未压缩的原始数据长度 quartetBuffer=newbyte[4]; longposition=sourceStream.Length-4; sourceStream.Position=position; sourceStream.Read(quartetBuffer,0,4);
intcheckLength=BitConverter.ToInt32(quartetBuffer,0); byte[]data; if(checkLength<=sourceStream.Length) { data=newbyte[Int16.MaxValue]; } else { data=newbyte[checkLength+100]; } //每100byte从解压流中读出数据,并将读出的数据Copy到Databyte[]中,这样就完成了对数据的解压 byte[]buffer=newbyte[100];
sourceStream.Position=0;
intoffset=0; inttotal=0;
while(true) { intbytesRead=decompressedStream.Read(buffer,0,100);
if(bytesRead==0) break;
buffer.CopyTo(data,offset);
offset+=bytesRead; total+=bytesRead; } //剔除多余的byte byte[]actualdata=newbyte[total];
for(inti=0;i<total;i++) actualdata[i]=data[i];
returnactualdata; } catch(Exceptionex) { thrownewException(String.Format("从文件{0}解压数据时发生错误",srcFile),ex); } finally { if(sourceStream!=null) sourceStream.Close();
if(decompressedStream!=null) decompressedStream.Close(); } }
} }