序列化与反序列化 - 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 ...
随机推荐
- QProcess进程间双向通信
记得以前写过Linux的C程序, 里面用popen打开一个子进程, 这样可以用read/write和子进程通讯, 而在子进程里则是通过从stdin读和向stdout写实现对父进程的通讯. QProce ...
- Qt判断和打开进程(windows端),运行,检测,中止
windows端的Qt程序往往需要打开外部程序(如:prog.exe),并且需要确定这个外部程序是唯一打开的. 1.判断系统中是否存在prog.exe void judge() { QProcess ...
- 《Programming WPF》翻译 第9章 2.选择一个基类
原文:<Programming WPF>翻译 第9章 2.选择一个基类 WPF提供了很多类,当创建一个自定义元素时,你可以从这些类中派生.图9-1显示了一组可能作为类--可能是合适的基类, ...
- Xming + PuTTY 在Windows下远程Linux主机
Xming + PuTTY 在Windows下远程Linux主机 一.原理 Linux/Unix的X Window具有网络透明性.X Window系统里有一个统一的Server来负责各个程序与 ...
- 【转】将 Linux 应用程序移植到 64 位系统上
原文网址:http://www.ibm.com/developerworks/cn/linux/l-port64.html 随着 64 位体系结构的普及,针对 64 位系统准备好您的 Linux® 软 ...
- 技术小白:Hadoop 到底是啥?
原文地址:http://os.51cto.com/art/201305/396145.htm 大数据是个铺天盖地的词,而谈论大数据又不可避免地要提到Hadoop,遗憾的是今天大多数大数据鼓吹者,甚至专 ...
- OpensStack instance debug
错误: 创建实例 "RuiyTest23" 失败: 请稍后再试 [错误: Virtual Interface creation failed].
- Javascript 中的变量
var a; console.log("The value of a is " + a); // The value of a is undefined console.log(& ...
- Git 笔记一 Git简介
git 笔记一 什么是版本控制 所谓版本控制就是记录对文件的修改记录,这样以后就能回退到需要的 版本.比如你对一段代码进行了几次修改,有几次修改不想要了,如果 使用了版本控制,就可以回退到未做这些修改 ...
- Java中String直接赋字符串和new String的区别
解析Java中的String对象的数据类型 1. String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ...