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