序列化的作用是什么?为什么要序列化?

  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)的更多相关文章

  1. .NET中XML序列化和反序列化常用类和用来控制XML序列化的属性总结(XmlSerializer,XmlTypeAttribute,XmlElementAttribute,XmlAttributeAttribute,XmlArrayAttribute...)

    序列化和反序列化是指什么? 序列化(seriallization): 将对象转化为便于传输的数据格式, 常见的序列化格式:二进制格式,字节数组,json字符串,xml字符串.反序列化(deserial ...

  2. 对象序列化与反序列化(二进制 byte[])

    .序列化 public static byte[] SerializeObject(object obj) { if (obj == null) return null; MemoryStream m ...

  3. C#对象序列化与反序列化zz

      C#对象序列化与反序列化(转载自:http://www.cnblogs.com/LiZhiW/p/3622365.html) 1. 对象序列化的介绍........................ ...

  4. C#对象序列化与反序列化

    C#对象序列化与反序列化(转载自:http://www.cnblogs.com/LiZhiW/p/3622365.html) 1. 对象序列化的介绍.......................... ...

  5. [转载]C#对象序列化与反序列化

    文章写的实在是太好了,忍不住转来: http://www.cnblogs.com/LiZhiW/p/3622365.html#_Toc8478 1.对象序列化的介绍 (1).NET支持对象序列化的几种 ...

  6. Asp.Net_序列化、反序列化

    .net序列化及反序列化 在我们深入探讨C#序列化和反序列化之前我们先要明白什么是序列化,它又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制.序列化就是把一个对象保存到一个文件或数据库 ...

  7. C#: .net序列化及反序列化 [XmlElement(“节点名称”)]

    .net序列化及反序列化 序列化是指一个对象的实例可以被保存,保存成一个二进制串,当然,一旦被保存成二进制串,那么也可以保存成文本串了.比如,一个计数器,数值为2,我们可以用字符串“2”表示.如果有个 ...

  8. C#: .net序列化及反序列化 [XmlElement(“节点名称”)] [XmlAttribute(“节点属性”)] (上篇)

    .net序列化及反序列化 序列化是指一个对象的实例可以被保存,保存成一个二进制串,当然,一旦被保存成二进制串,那么也可以保存成文本串了.比如,一个计数器,数值为2,我们可以用字符串"2&qu ...

  9. XmlSerializer 对象的Xml序列化和反序列化

    http://www.cnblogs.com/yukaizhao/archive/2011/07/22/xml-serialization.html 这篇随笔对应的.Net命名空间是System.Xm ...

随机推荐

  1. QProcess进程间双向通信

    记得以前写过Linux的C程序, 里面用popen打开一个子进程, 这样可以用read/write和子进程通讯, 而在子进程里则是通过从stdin读和向stdout写实现对父进程的通讯. QProce ...

  2. Qt判断和打开进程(windows端),运行,检测,中止

    windows端的Qt程序往往需要打开外部程序(如:prog.exe),并且需要确定这个外部程序是唯一打开的. 1.判断系统中是否存在prog.exe void judge() { QProcess ...

  3. 《Programming WPF》翻译 第9章 2.选择一个基类

    原文:<Programming WPF>翻译 第9章 2.选择一个基类 WPF提供了很多类,当创建一个自定义元素时,你可以从这些类中派生.图9-1显示了一组可能作为类--可能是合适的基类, ...

  4. Xming + PuTTY 在Windows下远程Linux主机

    Xming + PuTTY 在Windows下远程Linux主机 一.原理     Linux/Unix的X Window具有网络透明性.X Window系统里有一个统一的Server来负责各个程序与 ...

  5. 【转】将 Linux 应用程序移植到 64 位系统上

    原文网址:http://www.ibm.com/developerworks/cn/linux/l-port64.html 随着 64 位体系结构的普及,针对 64 位系统准备好您的 Linux® 软 ...

  6. 技术小白:Hadoop 到底是啥?

    原文地址:http://os.51cto.com/art/201305/396145.htm 大数据是个铺天盖地的词,而谈论大数据又不可避免地要提到Hadoop,遗憾的是今天大多数大数据鼓吹者,甚至专 ...

  7. OpensStack instance debug

    错误: 创建实例 "RuiyTest23" 失败: 请稍后再试 [错误: Virtual Interface creation failed].

  8. Javascript 中的变量

    var a; console.log("The value of a is " + a); // The value of a is undefined console.log(& ...

  9. Git 笔记一 Git简介

    git 笔记一 什么是版本控制 所谓版本控制就是记录对文件的修改记录,这样以后就能回退到需要的 版本.比如你对一段代码进行了几次修改,有几次修改不想要了,如果 使用了版本控制,就可以回退到未做这些修改 ...

  10. Java中String直接赋字符串和new String的区别

    解析Java中的String对象的数据类型 1. String是一个对象.  因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ...