【IT168技术文档】
下一个格式化程序的选择是SoapFormatter类型。SoapFormatter类型将把对象图持久化为一个SOAP消息,当希望使用HTTP协议远程分派对象时,这个方式是一个可靠的选择。如果不熟悉SOAP的规范,现在不需要在细节上花费时间。简而言之,SOAP定义了一个标准的过程,在这个过程中可以用与平台和操作系统无关的方式调用方法(我们将在本书最后一章讨论XML Web服务时学习SOAP更多的知识)。
假定你引用了System.Runtime.Serialization.Formatters.Soap.dll程序集,只需将出现的每个Binary- Formatter替换为SoapFormatter就可以持久化并接收JamesBondCar为一个SOAP消息。参考下面的代码,它将一个对象序列化为一个本地文件CarData.soap:
和之前一样,仅仅使用Serialize()和Deserialize()方法将对象图移入和移出流。如果打开一个产生结果的*.soap文件,可以定位到标记了当前JamesBondCar的状态值的XML元素上,也可以通过#ref标记定位到对象图中对象间的关系上。参考以下最终的结果(XML命名空间被省略):using System.Runtime.Serialization.Formatters.Soap; ... static void Main(string[] args) { ... // 将对象以SOAP格式保存到CarData.soap文件中。 SoapFormatter soapFormat = new SoapFormatter(); fStream = new FileStream("CarData.soap", FileMode.Create, FileAccess.Write, FileShare.None); soapFormat.Serialize(fStream, jbc); fStream.Close(); Console.ReadLine(); }
<SOAP-ENV:Envelope xmlns:xsi="..."> <SOAP-ENV:Body> <a1:JamesBondCar id="ref-1" xmlns:a1="..."> <canFly>true</canFly> <canSubmerge>false</canSubmerge> <theRadio href="#ref-3"/> <isHatchBack>false</isHatchBack> </a1:JamesBondCar> <a1:Radio id="ref-3" xmlns:a1="..."> <hasTweeters>true</hasTweeters> <hasSubWoofers>false</hasSubWoofers> <stationPresets href="#ref-4"/> </a1:Radio> <SOAP-ENC:Array id="ref-4" SOAP-ENC:arrayType="xsd:double[3]"> <item>89.3</item> <item>105.1</item> <item>97.1</item> </SOAP-ENC:Array> </SOAP-ENV:Body> </SOAP-ENV:Envelope>