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

  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. Linux下Bash运行脚本

    命令行应该这样写: sh -c "脚本字符串" example: sh -c "if ! type dpkg > /dev/null ; then echo 'so ...

  2. js收集错误信息,错误上报

    线上的代码可有有时候用户会反应不好使,一般是因为js造成的! 尤其在移动端各个手机之前的差异特别大. 下面这段代码是获取能帮助你! <script> window.onerror = fu ...

  3. linux下能ping ip不能ping域名详解

    今天在开发的同事来说,内网不能通过域名访问自己的服务器!然后做了下面的测试发现这样的问题: [root@itmop ~]# ping www.downcc.com ping: unknown host ...

  4. myeclipse中控制台日志比实际晚8小时解决方法及java日志处理

    今天终于忍不住要解决myeclipse控制台中日志显示比实际晚8小时的问题,开始以为myeclipse编辑器时间问题,后来想想不对,myeclipse控制台打印的是tomcat的日志,随后以为是log ...

  5. SQL查询最近三个月的数据(查询最近几天,几年等等)

    定义和用法      :: 天,这样就可以找到付款日期. 我们使用如下 ,OrderDate) AS OrderPayDate FROM Orders 结果: OrderId    OrderPayD ...

  6. Arm Linux系统调用流程详细解析

    Linux系统通过向内核发出系统调用(system call)实现了用户态进程和硬件设备之间的大部分接口. 系统调用是操作系统提供的服务,用户程序通过各种系统调用,来引用内核提供的各种服务,系统调用的 ...

  7. phpcms 缓存

    PHPCMS设置和读取缓存文件 PHPCMS开发中经常用到读取文件缓存,比如常见的当前站点类别,是保存在缓存文件中的,读取的时候 用:$this->categorys = getcache(‘c ...

  8. android-sdk-windows版本号下载

    Android SDK 4.0.3 开发环境配置及执行 近期又装了一次最新版本号的ADK环境 眼下最新版是Android SDK 4.0.3 本文的插图和文本尽管是Android2.2的 步骤都是一样 ...

  9. iOS绘图教程

    本文是<Programming iOS5>中Drawing一章的翻译,考虑到主题完整性,翻译版本中加入了一些书中未涉及到的内容.希望本文能够对你有所帮助.(本文由海水的味道翻译整理,转载请 ...

  10. 关于js中select的简单操作,以及js前台计算,span简单操作

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...