26.5.2 SoapFormatter

SoapFormatter类型允许把对象持久化为一个SOAP[1]消息,当希望使用HTTP协议远程发送对象时,这是一个不错的方式。SoapFormatter位于System.Runtime.Serialization.Formatters.Soap命名空间。如果不熟悉SOAP的规范也没关系,不需要在细节上花费时间,只需要知道序列化后的结果是一种符合SOAP标准的XML就可以了。

我们新建的C#控制台工程默认并不包含对System.Runtime.Serialization.Formatters.Soap命名空间的引用,需要我们手动加入,如图26-10所示。

26.5.2 SoapFormatter - 图1

图 26-10 添加对System.Runtime.Serialization.Formatters.Soap的引用

加入了引用就可以使用SoapFormatter类了,参考代码清单26-10,它将Person对象序列化为一个本地文件person.soap。

代码清单26-10 使用SoapFormatter进行序列化和反序列化


using System;

using System.Collections;

using System.IO;

using System.Runtime.Serialization.Formatters.Soap;

using System.Text;

namespace ProgrammingCSharp4

{

class SerializeSample

{

string strFile="person.soap";

public 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());

SerializeSample ss=new SerializeSample();

ss.Serialize(person);

Person person2=ss.DeSerialize();

Console.WriteLine(person2.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=(Person)formatter.Deserialize(fs);

}

return person;

}

}

}


上述代码运行的结果为:


Name:张三

Height:175cm

Birthday:2000-1-1

Weight:80

Favourites:看电视

看电影

上网冲浪

Name:张三

Height:175cm

Birthday:

Weight:80

Favourites:看电视

看电影

上网冲浪

请按任意键继续……


生成的SOAP消息如代码清单26-11所示(省略了XML命名空间)。

代码清单26-11 person.soap文件的内容


<SOAP-ENV:Body>

<a1:Person id="ref-1">

<name id="ref-3">张三</name>

<favourites href="#ref-4"/>

<weight>80</weight>

<height id="ref-5">175cm</height>

</a1:Person>

<a2:ArrayList id="ref-4">

<_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>


图26-11说明了上述过程。

26.5.2 SoapFormatter - 图2

图 26-11 使用SOAP格式进行序列化

[1]SOAP,简单对象访问协议(Simple Object Access Protocol)的简称,是一种标准化的通讯规范,主要用于Web服务中。SOAP使用互联网应用层协议作为其传输协议,SMTP和HTTP协议都可以用来传输SOAP消息,但是由于HTTP在如今的互联网结构中工作得很好,特别是在网络防火墙下仍然工作流畅,所以其被更为广泛地采纳。SOAP亦可以在HTTPS上进行传输。