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

本文实例讲述了.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#程序设计有所帮助。

(0)

相关推荐

  • asp.net 序列化and反序列化演示

    什么是序列化? ---.net的运行时环境用来支持用户定义类型的流化的机制.它是将对象实例的状态存储到存储媒体的过程.在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流.在随后对对象进行反序列化时,将创建出与原对象完全相同的副本. 序列化的目的: 1.以某种存储形式使自定义对象持久化: 2.将对象从一个地方传递到另一个地方. 实质上序列化机制是将类的值转化为一个一般的(即连续的)字节流,然后就可以将该流写到磁盘文件或任何其他流化目标上

  • ASP.NET中JSON的序列化和反序列化使用说明

    在网站应用中使用JSON的场景越来越多,本文介绍 ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间.集合.字典的处理. 一.JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是"名值对"的集合.结构由大括号'{}',中括号'[]',逗号',',冒号':',双引号'""'组成,包含

  • asp.net xml序列化与反序列化第1/2页

    在网上找了一些关于xml序列化与反序列化的资料,摘录下:        在.NET下有一种技术叫做对象序列化,它可以将对象序列化为二进制文件.XML文件.SOAP文件,这样, 使用经过序列化的流进行传输效率就得到了大大的提升. 在.NET中提供了两种序列化:二进制序列化.XML和SOAP序列化.对于WEB应用来说,用得最多的是第二种---XML和SOAP序列化. XML 序列化将对象的公共字段和属性或者方法的参数和返回值转换(序列化)为符合特定 XML 架构定义 语言 (XSD) 文档的 XML

  • .net实现序列化与反序列化实例解析

    序列化与反序列化是.net程序设计中常见的应用,本文即以实例展示了.net实现序列化与反序列化的方法.具体如下: 一般来说,.net中的序列化其实就是将一个对象的所有相关的数据保存为一个二进制文件(注意:是一个对象) 而且与这个对象相关的所有类型都必须是可序列化的所以要在相关类中加上 [Serializable]特性 对象类型包括:对象本身包含的类型,父类 拥有需要的对象之后: 1.将对象转换为二进制数据 使用专门的对像进行转换 BinaryFormatter 2.将二进制数据写入到文件 Fil

  • Jquery 组合form元素为json格式,asp.net反序列化

    作者:敖士伟 Email:ikmb@163.com 转载注明作者 说明: 1.js根据表单元素class属性,把表单元素的name和value组合为json格式;用表单元素class属性可以针对性地组合JSON数据. 2.后端ASP.NET用JavaScriptSerializer反序列化为对象实列. 3.好处:简化了前端数据读取与后端数据赋值. 复制代码 代码如下: function GetJSONStr(class_name) { var a = []; //文本框 $("." +

  • .Net中的序列化和反序列化详解

    序列化和反序列化相信大家都经常听到,也都会用, 然而有些人可能不知道:.net为什么要有这个东西以及.net Frameword如何为我们实现这样的机制, 在这里我也是简单谈谈我对序列化和反序列化的一些理解. 一.什么序列化和反序列化 序列化通俗地讲就是将一个对象转换成一个字节流的过程,这样就可以轻松保存在磁盘文件或数据库中.反序列化是序列化的逆过程,就是将一个字节流转换回原来的对象的过程. 然而为什么需要序列化和反序列化这样的机制呢?这个问题也就涉及到序列化和反序列化的用途了, 对于序列化的主

  • Java对象的XML序列化与反序列化实例解析

    上一篇文章我们介绍了java实现的各种排序算法代码示例,本文我们看看Java对象的xml序列化与反序列化的相关内容,具体如下. XML是一种标准的数据交换规范,可以方便地用于在应用之间交换各类数据.如果能在Java对象和XML文档之间建立某种映射,例如Java对象的XML序列化和反序列化,那么就可以使Java的对象方便地与其他应用进行交换. java.beans包里面有两个类XMLEncoder和Decoder,分别用于将符合JabaBeans规范的Java对象以XML方式序列化和反序列化.以下

  • Java 序列化和反序列化实例详解

    Java 序列化和反序列化实例详解 在分布式应用中,对象只有经过序列化才能在各个分布式组件之间传输,这就涉及到两个方面的技术-发送者将对象序列化,接受者将对象反序列化,下面就是一个很好的例子! 1.实体-Employee import java.io.Serializable; public class Employee implements Serializable{ /** * */ private static final long serialVersionUID = 1L; publi

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

    本文实例讲述了.net的序列化与反序列化的实现方法.分享给大家供大家参考.具体方法如下: 1.序列化与反序列化概述 C#中如果需要:将一个结构很复杂的类的对象存储起来,或者通过网路传输到远程的客户端程序中去,这时就需要用到序列化,反序列化(Serialization & Deserialization) 2.BinaryFormattter .NET中串行有三种,BinaryFormatter, SoapFormatter和XmlSerializer. 其中BinaryFormattter最简单

  • C#中datatable序列化与反序列化实例分析

    本文实例讲述了C#中datatable序列化与反序列化,分享给大家供大家参考.具体方法如下: 一.datatable序列化 public string getSendDetailQuery(DateTime timeS, DateTime timeE, string sccount) { try { SmsOperate so = new SmsOperate(); //得到dt DataTable dtt = so.getSendDetailQuery(timeS, timeE, sccoun

  • C#序列化与反序列化实例

    本文实例讲述了C#序列化与反序列化的方法.分享给大家供大家参考.具体分析如下: 把"对象"转换为"字节序列"的过程称为对象的序列化.     把"字节序列"恢复为"对象"的过程称为对象的反序列化. 序列化 复制代码 代码如下: using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;  using Syste

  • Java IO流对象的序列化和反序列化实例详解

    Java-IO流 对象的序列化和反序列化 序列化的基本操作 1.对象序列化,就是将Object转换成byte序列,反之叫对象的反序列化. 2.序列化流(ObjectOutputStream),writeObject 方法用于将对象写入输出流中: 反序列化流(ObjectInputStream),readObject 方法用于从输入流中读取对象. 3.序列化接口(Serializeable) 对象必须实现序列化接口,才能进行序列化,否则会出现异常.这个接口没有任何方法,只是一个标准. packag

  • C#实现json的序列化和反序列化实例代码

    在做asp.net和unity进行http通信的时候,当unity客户端发出表单请求的时候,我要将他要请求的数据以json的格式返回给客户端,让客户端来解析.服务器端这一块就涉及到json的序列化和反序列化的问题. 两种方法都有例子,第一种是用泛型集合来存储的对象,然后将集合序列化一下:第二种是直接序列化的一个对象 复制代码 代码如下: using System;using System.Collections.Generic;using System.Web.Script.Serializat

  • springboot jackson自定义序列化和反序列化实例

    目录 jackson自定义序列化和反序列 序列化JsonSerializer 最后请求http返回对象 反序列化JsonDeserializer 小结一下 springboot 自定义序列化器 jackson自定义序列化和反序列 spingmvc使用httpmessageconverter接口来转换http请求和响应. 如果需要添加和自定义转换器,则可以使用spring boot的HttpMessageConverters类:任何存在于上下文中的HttpMessageConverter的ben都

  • python3序列化与反序列化用法实例

    本文实例讲述了python3序列化与反序列化用法.分享给大家供大家参考.具体如下: #coding=utf-8 import pickle aa={} aa["title"]="我是好人" aa["num"]=2 t=pickle.dumps(aa)#序列化这个字典 print(t) f=pickle.loads(t)#反序列化,还原原来的状态 print(f) 运行结果如下: (dp0 S'num' p1 I2 sS'title' p2 S'\

随机推荐