本文实例讲述了.net的序列化与反序列化的实现方法。分享给大家供大家参考。具体方法如下:
1.序列化与反序列化概述
C#中如果需要:将一个结构很复杂的类的对象存储起来,或者通过网路传输到远程的客户端程序中去,这时就需要用到序列化,反序列化(Serialization & Deserialization)
2.BinaryFormattter
.NET中串行有三种,BinaryFormatter, SoapFormatter和XmlSerializer.
其中BinaryFormattter最简单,它是直接用二进制方式把对象 (Object)进行串行或反串,他的优点是速度快,可以串行private或者protected的member, 在不同版本的。NET中都兼容,可以看作是。NET自己的本命方法,当然缺点也就随之而来了,离开了。NET它就活不了,所以不能在其他平台或跨网路上进 行。
3.序列化
BinaryFormatter ser = new BinaryFormatter(); MemoryStream ms = new MemoryStream(); ser.Serialize(ms, DS); byte[] buffer = ms.ToArray();
MemoryStream :创建其支持存储区为内存的流
4.反序列化
//反序列化:将byte[]型的数据,放到Stream中,BinaryFormatter将流中的数据反序列化成对象 MemoryStream ms = new MemoryStream(bytes); BinaryFormatter ser = new BinaryFormatter(); DataSetSurrogate dss = ser.Deserialize(ms) asDataSetSurrogate;
5.完整实例:
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(); } }
} }
6.小结
进行序列化,反序列化,利用到的都是BinaryFormate,都得借普通流MemoryStream,不同的是:
序列化时,将对象序列化后放到MemoryStream,而反序列化时,将MemoryStream中的byte[]数据,反序列成对象
希望本文所述对大家的C#程序设计有所帮助。
本文向大家介绍.net实现序列化与反序列化实例解析,包括了.net实现序列化与反序列化实例解析的使用技巧和注意事项,需要的朋友参考一下 序列化与反序列化是.net程序设计中常见的应用,本文即以实例展示了.net实现序列化与反序列化的方法。具体如下: 一般来说,.net中的序列化其实就是将一个对象的所有相关的数据保存为一个二进制文件(注意:是一个对象) 而且与这个对象相关的所有类型都必须是可序列化的
FAQs in section [36]: [36.1]“序列化”是什么东东? [36.2] 如何选择最好的序列化技术? [36.3] 如何决定是要序列化为可读的(“文本”)还是不可读的(“二进制”)格式? or non-human-readable ("binary") format?") [36.4] 如何序列化/反序列化数字,字符,字符串等简单类型? [36.5] 如何读/写简单类型为可读的
上一小节我们学习了 Java 的输入输出流,有了这些前置知识点,我们就可以学习 Java 的序列化了。本小节将介绍什么是序列化、什么是反序列化、序列化有什么作用,Serializable 接口以及 Externalizable 接口,常用序列化工具介绍等内容。 1. 序列化与反序列化 序列化在计算机科学的数据处理中,是指将数据结构或对象状态转换成可取用格式,以留待后续在相同或另一台计算机环境中,能
本文向大家介绍.Net中的序列化和反序列化详解,包括了.Net中的序列化和反序列化详解的使用技巧和注意事项,需要的朋友参考一下 序列化和反序列化相信大家都经常听到,也都会用, 然而有些人可能不知道:.net为什么要有这个东西以及.net Frameword如何为我们实现这样的机制, 在这里我也是简单谈谈我对序列化和反序列化的一些理解。 一、什么序列化和反序列化 序列化通俗地讲就是将一个对象转换成一
本文向大家介绍浅谈.Net中的序列化和反序列化,包括了浅谈.Net中的序列化和反序列化的使用技巧和注意事项,需要的朋友参考一下 序列化和反序列化相信大家都经常听到,也都会用, 然而有些人可能不知道:.net为什么要有这个东西以及.net Frameword如何为我们实现这样的机制, 在这里我也是简单谈谈我对序列化和反序列化的一些理解。 一、什么序列化和反序列化 序列化通俗地讲就是将一个对象转换成一
本文向大家介绍什么是序列化与反序列化?相关面试题,主要包含被问及什么是序列化与反序列化?时的应答技巧和注意事项,需要的朋友参考一下 序列化:将对象状态转换为可保持或传输的格式的过程。将对象实例的字段及类的名称转换成字节流,然后把字节流写入数据流 反序列化:将流转换为对象。 这两个过程结合起来,可以轻松地存储和传输数据。