[.net 面向对象程序设计进阶] (9) 序列化(Serialization) (一) 二进制流序列化
[.net 面向对象程序设计进阶] (9) 序列化(Serialization) (一) 二进制流序列化
本节导读:
在.NET编程中,经常面向对象处理完以后要转换成另一种格式传输或存储,这种将对象转向其他数据格式的过程,即序列化(Serialization)。
与之相反的过程就是反序列化(Deserialization)。掌握和利用好序列化和反序列化的方法,对提高面向编程技术很有益处。
读前必备:
A.类和类的实例 [.net 面向对象编程基础] (9) 类和类的实例
B.类的成员 [.net 面向对象编程基础] (10) 类的成员(字段、属性、方法)
1. 什么是序列化和反序列化?
序列化(Serialization):序列化是将对象状态转换为可保持或传输的格式的过程。
反序列化(Deserialization) :与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
在MFC中储存或恢复对象的过程即为Serialization,也称为Persistent(永续生存)。在序列化期间,对象将其当前状态写入到临时或永久性存储区(存入文件中)。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。以此达到面向对象中的永续生存。
2. .NET中的序列化技术
.NET Framework 几种序列化技术,主要有以下几种:
严格来说只有两种,就是二进制序列化,和使用数据格式协定的序列化(包含XML,SOAP.JSON等)
A. 二进制(流)序列化(BinaryFormatter) -->(C/S方向为主)
二进制序列化保持类型保真度,用于在应用程序的不同调用之间保留对象的状态。
例如,通过将对象序列化到剪贴板,可在不同的应用程序之间共享对象。您可以将对象序列化到流、磁盘、内存和网络等等。远程处理使用序列化“通过值”在计算机或应用程序域之间传递对象。
B. XML 序列化(XmlSerializer) -->(B/S C/S通用)
XML序列化仅序列化公共属性和字段,且不保持类型保真度。对于要提供或使用数据而不限制使用该数据的应用程序时,比较有用的。由于 XML 是一个开放式标准,因此,对于通过 Web 共享数据而言,这是一个很好的选择。
C. SOAP序列化(SoapFormatter) -->(通用,主要用于WebSerice交换数据)
SOAP同样是一个开放式标准,这SOAP协议是一个在异构的应用程序之间进行信息交互的理想的选择
D. WCF协议序列化(DataContractSerializer)-->(B/S方向,主要用于WCF通讯)
F. Json序列化 (DataContractJsonSerializer)-->(B/S移动开发 方向)
Json全称是 JavaScript 对象表示法(JavaScript Object Notation))是一种轻量级的数据交换方式。
3. 二进制(流)序列化
本节主要介绍二进制(流)序列化
二进制(流)序列化,主要在底层(相对)通讯中使用比较频繁,我们知道计算机是通过二进制将数据传输和存储到媒介(硬盘等),那么我们在进行面向对象编程中,如何准确快速的将对象实例转换为二进制流,就是我们这节要介绍的内容。
对象=》二进制流 即二进制流序列化
下面,我还是使用“基础篇”中“武林高手”的类来 通过“文件流”创建文件。
首先创建数据类及序列化方法,如下:
注意一下:[Serializable]标识
Serializable属性用来明确表示该类可以被序列化。
同样的,我们可以用NonSerializable属性用来明确表示类不能被序列化。
/// <summary>
/// 类:武林高手
/// MartialArtsMaster
/// </summary>
[Serializable]
class MartialArtsMaster
{
/// <summary>
/// 编号
/// </summary>
public int Id { get; set; }
/// <summary>
/// 姓名
/// </summary>
public string Name { get; set; }
/// <summary>
/// 年龄
/// </summary>
public int Age { get; set; }
/// <summary>
/// 门派
/// </summary>
public string Menpai { get; set; }
/// <summary>
/// 武学
/// </summary>
public string Kungfu { get; set; }
/// <summary>
/// 级别
/// </summary>
public int Level { get; set; }
} /// <summary>
/// 二进制序列化和反序列化类
/// </summary>
public class Serializer
{
/// <summary>
/// 使用二进制序列化对象。
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static byte[] SerializeBytes(object value)
{
if (value == null) return null; var stream = new MemoryStream();
new BinaryFormatter().Serialize(stream, value); //var dto = Encoding.UTF8.GetString(stream.GetBuffer());
var bytes = stream.ToArray();
return bytes;
} /// <summary>
/// 使用二进制反序列化对象。
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
public static object DeserializeBytes(byte[] bytes)
{
if (bytes == null) return null; //var bytes = Encoding.UTF8.GetBytes(dto as string);
var stream = new MemoryStream(bytes); var result = new BinaryFormatter().Deserialize(stream); return result;
}
}
下面是调用方法:
//本例命名空间
//using System.Runtime.Serialization.Formatters.Binary;
//using System.IO; //初始化武林高手
var master = new List<MartialArtsMaster>(){
new MartialArtsMaster(){ Id = , Name = "黄蓉", Age = , Menpai = "丐帮", Kungfu = "打狗棒法", Level = },
new MartialArtsMaster(){ Id = , Name = "洪七公", Age = , Menpai = "丐帮", Kungfu = "打狗棒法", Level = },
new MartialArtsMaster(){ Id = , Name = "郭靖", Age = , Menpai = "丐帮", Kungfu = "降龙十八掌",Level = },
new MartialArtsMaster(){ Id = , Name = "任我行", Age = , Menpai = "明教", Kungfu = "葵花宝典", Level = },
new MartialArtsMaster(){ Id = , Name = "东方不败",Age = , Menpai = "明教", Kungfu = "葵花宝典", Level = },
new MartialArtsMaster(){ Id = , Name = "林平之", Age = , Menpai = "华山", Kungfu = "葵花宝典", Level = },
new MartialArtsMaster(){ Id = , Name = "岳不群", Age = , Menpai = "华山", Kungfu = "葵花宝典", Level = }
}; //文件流写入
using (FileStream fs = new FileStream(@"F:\360同步云盘\360同步云盘\博客\序列化\master.obj", FileMode.Append))
{
var myByte = Serializer.SerializeBytes(master);
fs.Write(myByte, , myByte.Length);
fs.Close();
}; //文件流读取
using (FileStream fsRead = new FileStream(@"F:\360同步云盘\360同步云盘\博客\序列化\master.obj", FileMode.Open))
{
int fsLen = (int)fsRead.Length;
byte[] heByte = new byte[fsLen];
int r = fsRead.Read(heByte, , heByte.Length);
var myObj = Serializer.DeserializeBytes(heByte) as List<MartialArtsMaster>;
Console.WriteLine("编号---姓名---年龄---门派---武功---等级");
myObj.ForEach(m =>
Console.WriteLine(m.Id + "---" + m.Name + "---" + m.Age + "---" + m.Menpai + "---" + m.Kungfu + "---" + m.Level)
);
}
运行结果如下:
首先是创建的文件master.obj:

读取运行结果如下:

4.要点:
A.序列化和反序列化的理解:
序列化(Serialization):序列化是将对象状态转换为可保持或传输的格式的过程。
反序列化(Deserialization) :与序列化相对的是反序列化,它将流转换为对象。
B. .NET中的序列化技术
注明了主要使用方向,方便小伙伴们有选择性的学习。
(1)二进制(流)序列化( BinaryFormatter) -->(C/S方向为主)
(2)XML 序列化(XmlSerializer) -->(B/S C/S通用)
(3)SOAP序列化(SoapFormatter -->(通用,主要用于WebSerice交换数据)
(4)WCF协议序列化(DataContractSerializer)-->(B/S方向,主要用于WCF通讯)
(5) Json序列化 (DataContractJsonSerializer)-->(B/S移动开发 方向)
==============================================================================================
<如果对你有帮助,记得点一下推荐哦,如有有不明白或错误之处,请多交流>
<对本系列文章阅读有困难的朋友,请先看《.net 面向对象编程基础》>
<转载声明:技术需要共享精神,欢迎转载本博客中的文章,但请注明版权及URL>
.NET 技术交流群:467189533 
==============================================================================================
[.net 面向对象程序设计进阶] (9) 序列化(Serialization) (一) 二进制流序列化的更多相关文章
- [.net 面向对象程序设计进阶] (1) 开篇
[.net 面向对象程序设计进阶] (1) 开篇 上一系列文章<.net 面向对象编程基础>写完后,很多小伙伴们希望我有时间再写一点进阶的文章,于是有了这个系列文章.这一系列的文章中, 对 ...
- [.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类
[.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类 本节导读: 关于JSON序列化,不能 ...
- [.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化
[.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化 本节导读: 介绍JSON的结构,在JS中的使用.重点说明JSON如何在.N ...
- [.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类
[.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类 本节导读:本节主要介绍通过序列 ...
- [.net 面向对象程序设计进阶] (28) 结束语——告别2015
[.net 面向对象程序设计进阶] (28) 结束语——告别2015 <.net面向对象程序设计进阶>这一系列文章写了太长的时间了,大概有半年没写,在年底又一口气写了好几篇.在整个过程中目 ...
- [.net 面向对象程序设计进阶] (27) 团队开发利器(六)分布式版本控制系统Git——在Visual Studio 2015中使用Git
[.net 面向对象程序设计进阶] (26) 团队开发利器(六)分布式版本控制系统Git——在Visual Studio 2015中使用Git 本篇导读: 接上两篇,继续Git之旅 分布式版本控制系统 ...
- [.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit
[.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit 读前必备: 接上篇: 分布式版本控制系统Git——使用GitS ...
- [.net 面向对象程序设计进阶] (25) 团队开发利器(四)分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境
[.net 面向对象程序设计进阶] (25) 团队开发利器(四)分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境 本篇导读: 前面介绍了两款代码管理工具 ...
- [.net 面向对象程序设计进阶] (24) 团队开发利器(三)使用SVN多分支并行开发(下)
[.net 面向对象程序设计进阶] (24) 团队开发利器(三)使用SVN多分支并行开发(下) 本篇导读: 接上篇继续介绍SVN的高级功能,即使用分支并行开发.随着需求的不断变更,新功能的增加.特别是 ...
随机推荐
- C# 抓取网站数据
项目主管说这是项目中的一个亮点(无语...), 类似于爬虫一类的东西,模拟登陆后台系统,获取需要的数据.然后就开始研究这个. 之前有一些数据抓取的经验,抓取流程无非:设置参数->服务端发送请求- ...
- [学习笔记]坚果云网盘,SVN异地代码管理
SVN的好处不必多说了.但是如果希望有一份自己的用来学习和储备的代码仓库,那么能够异地同步是必不可少的了. 参考作者Mike_QSJ的文章,但是实际上做了很大的改动.一方面使用更常见的windows系 ...
- 设计模型MVC和JavaBean
六.设计模型1和设计模型2(MVC)1.模型1:JSP+JavaBean2.模型2:MVC M:Model模型 JavaBean V:视图 JSP C:控制器 Servlet 七.模型1开发一个简单的 ...
- android nio
Android开发进阶之NIO非阻塞包(二) 有关Android NIO我们主要分为三大类,ByteBuffer.FileChannel和SocketChannel.由于篇幅原因今天Android12 ...
- 构建angular项目
1. 安装yo与gulp bower $ npm install -g yo $ npm install -g gulp bower 2. 快速创建 $ npm install -g gene ...
- C# 换行符
winform 中 TextBox 的 Multiline属性设置为 true ,敲入几个字符和几个回车,然后保存到数据库,再从数据库中读取出来赋值给TextBox,换行符丢失.将读取出的字符串中的& ...
- mysql5.6.34-debug Source distribution编译的几个错误
raspberrypi下编译mysql5.6 debug版源码. 1. 启动错误 和mysqld相关的文件及文件夹权限必须设置为mysql用户可读可写可执行!谨记! 2. gdb错误 root@: g ...
- windows下nginx的启动关闭
Windows下Nginx的启动.停止等命令 在Windows下使用Nginx,我们需要掌握一些基本的操作命令,比如:启动.停止Nginx服务,重新载入Nginx等,下面我就进行一些简单的介绍. .启 ...
- Echarts给柱状图每一条顶部都添加数值
在 series中添加 itemStyle : { normal: {label : {show: true}}}, 不过目测要把markPoint等去掉,不然最大值和最小值会和label冲突,应该有 ...
- 时间同步ntp服务的安装与配置
1,首先安装ntp服务. [root@localhost /]# yum install ntp -y 2,修改ntp配置文件.(ntp配置文件在:/etc/ntp.conf) [root@local ...