专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 Web Service序列化和反序列化

Web Service序列化和反序列化

更新时间:2020-09-22 17:20:32 来源:动力节点 浏览876次

 

在此之前,我们已经学过不少程序的序列化和反序列化,而且对序列化和反序列化的概念已经了然于心。通俗来讲,序列化就是把内存里面的这些对象给变成一连串的字节描述的过程,反序列化则反之。本文我们就一起来学习和探究Web Service序列化和反序列化

在Web Service中,SoapExtension和SoapExtensionAttribute两个类用于控制Web Service序列化和反序列化的一般过程,可对Web Service进行压缩和日志等功能进行控制,同时还具有对整个Web Service传输的wsdl进行压缩的功能。

SoapExtensionAttribute类:

public class ExtensionAttribute:SoapExtensionAttribute

{

int _priority = 1;

public override int Priority

{

get

{

return _priority;

}

set

{

_priority = value;

}

}

public override Type ExtensionType

{

get { return typeof(MyExtension); }//定义扩展soap的类型

}

}

这个SoapExtensionAttribute抽象类定义如下:

protected SoapExtensionAttribute();

// 返回结果:

// SOAP 扩展的 System.Type。

public abstract Type ExtensionType { get; }

// 返回结果:

// SOAP 扩展的优先级。

SOAP 扩展分配优先级,该优先级有助于确定当配置多个 SOAP 扩展以便使用 XML Web 服务方法时执行的相对顺序。SOAP 扩展的优先级越高,它的执行与通过网络发送或接收 SOAP 消息越近。SOAP 扩展属于三个优先级组中的任意一个。在每个组内,priority 属性区别每个成员。priority 属性越低,相对优先级就越高(0 是最高的)。

public abstract int Priority { get; set; }

//以下为扩展的soapextension类

public class MyExtension:SoapExtension

{

public override object GetInitializer(Type serviceType)

{

return GetType();

}

public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)

{

return null;

}

public override void Initialize(object initializer)

{

}

//这个override的方法会被调用四次

//分别是SoapMessageStage的BeforeSerialize,AfterSerialize,BeforeDeserialize,AfterDeserialize

public override void ProcessMessage(SoapMessage message)

{

if (message.Stage == SoapMessageStage.AfterDeserialize) //反序列化后处理

{

bool check = false;

foreach (SoapHeader header in message.Headers)

{

if (header is CertficateSoapHeader)

{

CertficateSoapHeader myHeader = (CertficateSoapHeader)header;

if (myHeader.UserName == null || myHeader.PassWord == null)

{

break;

}

if (myHeader.UserName.Equals("LY") && myHeader.PassWord.Equals("LY"))

{

check = true;

break;

}

}

}

if (!check)

{

throw new SoapHeaderException("认证失败", SoapException.ClientFaultCode);

}

}

}

}

通过SoapMessage中的stream可以获取发送和收到的流数据,上面的功能实现了soapheader的权限认证,实现上面的类后,我们就不需要在webmethod中进行判断,只需要加入相关的属性即可,如:

public CertficateSoapHeader soapHeader;

[ExtensionAttribute]

[SoapHeader("soapHeader",Direction=SoapHeaderDirection.In)]

[WebMethod]

public string HelloWorld()

{

return "Hello World";

}

客户端的调用和前面一样,可见在Web Service中soapextension中的ProcessMessage就相当于一个拦截器,能对进入webmethod的stream进行相关的截获。

综上所述,Web Service序列化和反序列化依赖于SoapExtension和SoapExtensionAttribute两个类。熟悉和熟练使用SoapExtension类和SoapExtensionAttribute类是我们掌握Web Service序列化和反序列化的关键所在。


提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>