序列化与反序列化 - BinaryFormatter二进制(.dat)、SoapFormatter(.soap)、XmlSerializer(.xml)
序列化的作用是什么?为什么要序列化?
1、在进程下次启动时读取上次保存的对象的信息。
2、在不同的应用程序域或进程之间传递数据。
3、在分布式应用程序中的各应用程序之间传输对象。
所为序列化,就是将对象先转换为一种适当格式,然后再将其传输到目标位置的过程。
所为适当格式,有时候需要是二进制格式,有时候需要SOAP格式或者其他的XML,JSON格式等,也可以使应用程序所特有的、定制化的格式。因此,可以将序列化视为将对象的状态保存到流或缓冲区的方法,和序列化相反的就是烦序列化,就是把对象或数据从序列化的状态恢复为其原始状态的过程。
.Net提供三种预定义的格式化程序:
1、BinaryFormatter
2、SoapFormatter
3、XmlSerializer
下面来分别介绍各种序列化。
BinaryFormatter
BinaryFormatter类允许使用二进制格式将对象序列化与反序列化,它位于System.Runtime.Serialization.Formatters.Binary命名空间。
当使用BinaryFormatter类序列化这种方式时,除了明确标注为不参与序列化的成员,一个对象中所有可以序列化的成员,包括当前对象引用的其他对象,都可以序列化。结果就是所有相关对象都会被复制一份新的拷贝。而不是简单地复制引用。

public class Program
{
string strFile = @"D:\person.dat";
static void Main(string[] args)
{
ArrayList favourites = new ArrayList();
favourites.Add("看电视");
favourites.Add("看电影");
favourites.Add("上网冲浪"); Person person = new Person(favourites) { height = "175cm", birthday = "2000-1-1" };
person.SetWeight(80.00);
Console.WriteLine(person.ToString()); Program Ser = new Program();
Ser.Serialize(person); //从文件中反序列化
Person person2 = Ser.DeSerialize();
Console.WriteLine(person2.ToString()); Console.ReadKey();
} [Serializable] //注意此处要标记为可序列化,否则报错
public class Person
{
//私有字段
private string name = "张三";
private ArrayList favourites = new ArrayList();
private double weight; //公共字段
public string height; //公共属性,但加了NonSerialized特性
[NonSerialized]
public string birthday; //默认构造函数
public Person()
{ } public Person(ArrayList favourites)
{
this.favourites = favourites;
} //只读属性
public string Name
{
get { return name; }
} //只读集合属性
public ArrayList Favourites
{
get { return favourites; }
} //方法
public void SetWeight(double weight)
{
this.weight = weight;
} public override string ToString()
{
StringBuilder builder = new StringBuilder();
builder.Append("Name:" + Name + "\n");
builder.Append("Height:" + height + "\n");
builder.Append("Birthday:" + birthday + "\n");
builder.Append("Weight:" + weight + "\n");
builder.Append("Favourites:");
for (int i = 0; i < favourites.Count; i++)
{
builder.Append(favourites[i] + "\n");
}
return builder.ToString();
}
} //序列化
public void Serialize(Person person)
{
using (FileStream fs = new FileStream(strFile, FileMode.Create))
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(fs,person);
}
} //反序列化
public Person DeSerialize()
{
Person person;
using (FileStream fs = new FileStream(strFile, FileMode.Open))
{
BinaryFormatter formatter = new BinaryFormatter();
person = formatter.Deserialize(fs) as Person;
}
return person;
}
}

输出结果如下所示:

注意观察到,除了birthday使用了属性[NonSerialized]没有被序列化之外,其他的值无论是公共的还是私有的,也不管是否只读,全部都被序列化了。
SoapFormatter
SoapFormatter类型允许把对象持久化为一个SOAP信息,当希望使用HTTP协议远程发送对象时,这是一个不错的方式。SoapFormatter位于System.Runtime.Serialization.Formatters.Soap命名空间。它将对象序列化为一个本地文件person.soap。

public class Program
{
string strFile = @"D:\person.soap";
static void Main(string[] args)
{
ArrayList favourites = new ArrayList();
favourites.Add("看电视");
favourites.Add("看电影");
favourites.Add("上网冲浪"); Person person = new Person(favourites) { height = "175cm", birthday = "2000-1-1" };
person.SetWeight(80.00);
Console.WriteLine(person.ToString()); Program Ser = new Program();
Ser.Serialize(person); //从文件中反序列化
Person person2 = Ser.DeSerialize();
Console.WriteLine(person2.ToString()); Console.ReadKey();
} [Serializable] //注意此处要标记为可序列化,否则报错
public class Person
{
//私有字段
private string name = "张三";
private ArrayList favourites = new ArrayList();
private double weight; //公共字段
public string height; //公共属性,但加了NonSerialized特性
[NonSerialized]
public string birthday; //默认构造函数
public Person()
{ } public Person(ArrayList favourites)
{
this.favourites = favourites;
} //只读属性
public string Name
{
get { return name; }
} //只读集合属性
public ArrayList Favourites
{
get { return favourites; }
} //方法
public void SetWeight(double weight)
{
this.weight = weight;
} public override string ToString()
{
StringBuilder builder = new StringBuilder();
builder.Append("Name:" + Name + "\n");
builder.Append("Height:" + height + "\n");
builder.Append("Birthday:" + birthday + "\n");
builder.Append("Weight:" + weight + "\n");
builder.Append("Favourites:");
for (int i = 0; i < favourites.Count; i++)
{
builder.Append(favourites[i] + "\n");
}
return builder.ToString();
}
} //序列化
public void Serialize(Person person)
{
using (FileStream fs = new FileStream(strFile, FileMode.Create))
{
SoapFormatter formatter = new SoapFormatter();
formatter.Serialize(fs,person);
}
} //反序列化
public Person DeSerialize()
{
Person person;
using (FileStream fs = new FileStream(strFile, FileMode.Open))
{
SoapFormatter formatter = new SoapFormatter();
person = formatter.Deserialize(fs) as Person;
}
return person;
}
}

注意到上面的代码与BinaryFormatter几乎一模一样,只是改了一下类名,而保存文件的扩展名。输出结果如下所示:

生成的.soap文件代码如下所示:

<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<a1:Program_x002B_Person id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/ConsoleApplication1/ConsoleApplication1%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
<name id="ref-3">张三</name>
<favourites href="#ref-4"/>
<weight>80</weight>
<height id="ref-5">175cm</height>
</a1:Program_x002B_Person>
<a2:ArrayList id="ref-4" xmlns:a2="http://schemas.microsoft.com/clr/ns/System.Collections">
<_items href="#ref-6"/>
<_size>3</_size>
<_version>3</_version>
</a2:ArrayList>
<SOAP-ENC:Array id="ref-6" SOAP-ENC:arrayType="xsd:anyType[4]">
<item id="ref-7" xsi:type="SOAP-ENC:string">看电视</item>
<item id="ref-8" xsi:type="SOAP-ENC:string">看电影</item>
<item id="ref-9" xsi:type="SOAP-ENC:string">上网冲浪</item>
</SOAP-ENC:Array>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

序列化与反序列化 - BinaryFormatter二进制(.dat)、SoapFormatter(.soap)、XmlSerializer(.xml)的更多相关文章
- .NET中XML序列化和反序列化常用类和用来控制XML序列化的属性总结(XmlSerializer,XmlTypeAttribute,XmlElementAttribute,XmlAttributeAttribute,XmlArrayAttribute...)
序列化和反序列化是指什么? 序列化(seriallization): 将对象转化为便于传输的数据格式, 常见的序列化格式:二进制格式,字节数组,json字符串,xml字符串.反序列化(deserial ...
- 对象序列化与反序列化(二进制 byte[])
.序列化 public static byte[] SerializeObject(object obj) { if (obj == null) return null; MemoryStream m ...
- C#对象序列化与反序列化zz
C#对象序列化与反序列化(转载自:http://www.cnblogs.com/LiZhiW/p/3622365.html) 1. 对象序列化的介绍........................ ...
- C#对象序列化与反序列化
C#对象序列化与反序列化(转载自:http://www.cnblogs.com/LiZhiW/p/3622365.html) 1. 对象序列化的介绍.......................... ...
- [转载]C#对象序列化与反序列化
文章写的实在是太好了,忍不住转来: http://www.cnblogs.com/LiZhiW/p/3622365.html#_Toc8478 1.对象序列化的介绍 (1).NET支持对象序列化的几种 ...
- Asp.Net_序列化、反序列化
.net序列化及反序列化 在我们深入探讨C#序列化和反序列化之前我们先要明白什么是序列化,它又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制.序列化就是把一个对象保存到一个文件或数据库 ...
- C#: .net序列化及反序列化 [XmlElement(“节点名称”)]
.net序列化及反序列化 序列化是指一个对象的实例可以被保存,保存成一个二进制串,当然,一旦被保存成二进制串,那么也可以保存成文本串了.比如,一个计数器,数值为2,我们可以用字符串“2”表示.如果有个 ...
- C#: .net序列化及反序列化 [XmlElement(“节点名称”)] [XmlAttribute(“节点属性”)] (上篇)
.net序列化及反序列化 序列化是指一个对象的实例可以被保存,保存成一个二进制串,当然,一旦被保存成二进制串,那么也可以保存成文本串了.比如,一个计数器,数值为2,我们可以用字符串"2&qu ...
- XmlSerializer 对象的Xml序列化和反序列化
http://www.cnblogs.com/yukaizhao/archive/2011/07/22/xml-serialization.html 这篇随笔对应的.Net命名空间是System.Xm ...
随机推荐
- PowerShell3.0中,所有的命令
Get-Command * >> cmd.txt CommandType Name ModuleName ----------- ---- ---------- Alias % -> ...
- Qt编程之UI与控件布局
当然,大家都知道UI界面可以用Qt Designer在约束环境下设置编辑.ui文件,再将.ui文件转换成对应的ui_XXX.h文件,这头文件中的内容是:用C++语言实现真正的界面布局.uic -o & ...
- paip.提升性能--- mysql 建立索引 删除索引 很慢的解决.
paip.提升性能--- mysql 建立索引 删除索引 很慢的解决. 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blo ...
- Linux环境 Mysql新建用户和数据库并授权
测试环境:linux 和Mysql 5.5.35 一.新建用户 //登录Mysql@>mysql -u root -p@>密码//创建用户mysql> insert into mys ...
- hbase单机安装
1.网上内容比较混乱,其实安装单机hbase只需要安装hbase即可 2.把hbase-0.xxx.tart.gz 拷贝到/opt/hbase文件及下(这是安装目录,可自定义) 2.1 tar xfz ...
- Vs2012于Linux应用程序开发(2):图案
1.1 代码提示功能 在vs中开发中,Visual Assist是一个很优秀的插件,我们仍然能够使用它进行代码的分析,但它仅仅能支持vcxprojproject,因而我们选择对vcxproj的 ...
- thinkphp框架的路径问题 - 总结
thinkphp框架的路径问题 - 总结 (2011-06-21 11:01:28) 转载▼ 标签: thinkphp 框架 路径 杂谈 分类: Php TP中有不少路径的便捷使用方法,比如模板中使用 ...
- [HeadFirst-HTMLCSS学习笔记][第十二章HTML5标记]
考虑HTML结构 HTML5即是把原来<div>换成一些更特定的元素.能够更明确指示包含什么内容. (页眉,导航,页脚,文章) article nav 导航 header footer t ...
- JQuery 1.3.2联动获取部门
Sql $(document).ready(function(){ $(".dept").bind("click", function () { v ...
- asp.net利用Ajax和Jquery在前台向后台传参数并返回值
1----------前台 首先需要 Jquer的包 <script src="js/jquery-1.9.1.js" type="text/javascript& ...