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

  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. hex格式介绍及转bin格式的源程序

    Intel HEX文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录,由十六进制数组成的机器码或者数据常量.Intel HEX文件经常被用于将程序或数据传输存储到 ...

  2. delphi 打开文件夹并定位到一个文件(关键是/select参数)

    strFileName := FcxLV[nIndex].Items.Item[FcxLV[nIndex].ItemIndex].SubItems.Strings[0]; //路径  ShellExe ...

  3. Apache RewriteRule QSA 什么意思

    看到下面这段代码: RewriteCond %{REQUEST_FILENAME} !-l RewriteRule ^(.+)$ index.php?url=$1 [QSA,L] The Rewrit ...

  4. web应用,我们需要了解什么?

        对于前端开发来说,web应用我们并不陌生.今天想要讨论一下,在开发一个web应用的时候,我们需要一些基本的知识储备.我们知道,一个web应用脱离不了(request)请求和响应(respons ...

  5. jsp页面判断文件上传类型

    <script language="javascript" type="text/javascript"> function check_file( ...

  6. XTU OJ 1209 Alice and Bob 2014(嘉杰信息杯ACM/ICPC湖南程序设计邀请赛暨第六届湘潭市程序设计竞赛)

    Problem Description The famous "Alice and Bob" are playing a game again. So now comes the ...

  7. 在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6578352 在数字科技日新月异的今天,软件和硬 ...

  8. CLR via C# - Char_String

    .NET中Char表示为16为的Unicode值,Char提供两个public const字段MinValue('\0',写成'\u0000'也是一样的)和MaxValue('\uffff'). Ch ...

  9. Android 4.4前后版本读取图库图片和拍照完美解决方案

    转载:http://blog.csdn.net/zbjdsbj/article/details/42387551 4.3或以下,选了图片之后,根据Uri来做处理,很多帖子都有了,我就不详细说了. 主要 ...

  10. GridView控件中插入自定义删除按钮并弹出确认框

    GridView控件中插入自定义删除按钮,要实现这个功能其实有多种方法,这里先记下我使用的方法,以后再添加其他方法. 一.实现步骤 1.在GridView中添加模板列(TemplateField). ...