C#序列化与反序列化(Serialize,Deserialize)实例详解

所属分类: 软件编程 / C#教程 阅读数: 85
收藏 0 赞 0 分享

本文实例讲述了C#序列化与反序列化(Serialize,Deserialize)实现方法。分享给大家供大家参考。具体分析如下:

如果要保存运行程序过程的数据要么保存到数据库中,要么新建一个普通的文件,然后把数据保存进去.但是这两者有个缺点就是,不能把原有数据的结构也保存进去.比如一个类中的字段值保存进去后再读取出来必须再解析下才行.序列化技术让你省去了解析的过程.保存后再读取时直接得到一个class

序列化的方式有三种:BinaryFormatter,SoapFormatter,XmlSerializer

1.BinaryFormatter

保存成二进制数据流.用法示例:

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable]
//如果要想保存某个class中的字段,必须在class前面加个这样attribute(C#里面用中括号括起来的标志符)
public class Person
{
public int age;
public string name;
[NonSerialized] //如果某个字段不想被保存,则加个这样的标志
public string secret;
}

序列化:

classProgram
{
 staticvoid Main(string[] args)
{
Person person = newPerson();
person.age = 18;
person.name = "tom";
person.secret = "i will not tell you";
FileStream stream =newFileStream(@"c:\temp\person.dat",FileMode.Create);
BinaryFormatter bFormat =newBinaryFormatter();
bFormat.Serialize(stream, person);
stream.Close();
}

反序列化:

classProgram
{
staticvoid Main(string[] args)
{
Person person = newPerson();
FileStream stream =newFileStream(@"c:\temp\person.dat",FileMode.Open);
BinaryFormatter bFormat =newBinaryFormatter();
person = (Person)bFormat.Deserialize(stream);
//反序列化得到的是一个object对象.必须做下类型转换
stream.Close();
Console.WriteLine(person.age + person.name + person.secret);
//结果为18tom.因为secret没有有被序列化.
}

2.SoapFormatter

把数据保存成xml文件.里面除了保存的内容还有些额外的Soap信息.它的用法和BinaryFormatter一样.只要把BinaryFormatter都替换成SoapFormatter就行.

把文件名改为person.xml

另外就是添加名称空间:using System.Runtime.Serialization.Formatters.Soap;
这个名称空调对就的程序集有时VS没有自动引用.你必须手动去引用.选中project,右击选择Add Reference.在.NET的标签下选择

System.Runtime.Serialization.Formatters.Soap.然后点OK.

补充:SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议,它包括四个部分:SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例; SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定;SOAP绑定(binding),使用底层协议交换信息。

3.XmlSerializer

也是保存成XML文件.但没有其他额外信息.另外它只能保存public类型的字段.而其他两种类型能保存所以类型的字段.
这里仍使用上面的Person类.

添加名称空间:

using System.IO;
using System.Xml.Serialization;

序列化:

classProgram
{
 staticvoid Main(string[] args)
{
Person person = newPerson();
person.age = 18;
person.name = "tom";
person.secret = "i will not tell you";
FileStream stream =newFileStream(@"c:\temp\xmlFormat.xml",FileMode.Create);
XmlSerializer xmlserilize = newXmlSerializer(typeof(Person));
xmlserilize.Serialize(stream, person);
stream.Close();
}

反序列化:

classProgram
{
staticvoid Main(string[] args)
{
Person person = newPerson();
FileStream stream =newFileStream(@"c:\temp\xmlFormat.xml",FileMode.Open);
XmlSerializerxmlserilize = newXmlSerializer(typeof(Person));
person = (Person)xmlserilize.Deserialize(stream);
stream.Close();
Console.WriteLine(person.age + person.name + person.secret);
}

希望本文所述对大家的C#程序设计有所帮助。

更多精彩内容其他人还在看

c#开发word批量转pdf源码分享

已经安装有Office环境,借助一些简单的代码即可实现批量Word转PDF,看下面的实例源码吧
收藏 0 赞 0 分享

c# xml API操作的小例子

这篇文章主要介绍了c# xml API操作的小例子,有需要的朋友可以参考一下
收藏 0 赞 0 分享

c#唯一值渲染实例代码

这篇文章主要介绍了c#唯一值渲染实例代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

淘宝IP地址库采集器c#代码

这篇文章主要介绍了淘宝IP地址库采集器c#代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

C#在后台运行操作(BackgroundWorker用法)示例分享

BackgroundWorker类允许在单独的专用线程上运行操作。如果需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用BackgroundWorker类方便地解决问题,下面看示例
收藏 0 赞 0 分享

c#文本加密程序代码示例

这是一个加密软件,但只限于文本加密,加了窗口控件的滑动效果,详细看下面的代码
收藏 0 赞 0 分享

c#生成站点地图(SiteMapPath)文件示例程序

这篇文章主要介绍了c#生成站点地图(SiteMapPath)文件的示例,大家参考使用
收藏 0 赞 0 分享

C# 键盘Enter键取代Tab键实现代码

这篇文章主要介绍了C# 键盘Enter键取代Tab键实现代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

C# WinForm导出Excel方法介绍

在.NET应用中,导出Excel是很常见的需求,导出Excel报表大致有以下三种方式:Office PIA,文件流和NPOI开源库,本文只介绍前两种方式
收藏 0 赞 0 分享

C#串口通信程序实例详解

在.NET平台下创建C#串口通信程序,.NET 2.0提供了串口通信的功能,其命名空间是System.IO.Ports,创建C#串口通信程序的具体实现是如何的呢?让我们开始吧
收藏 0 赞 0 分享
查看更多