hessian序列化规范.docx

上传人:b****5 文档编号:7913805 上传时间:2023-01-27 格式:DOCX 页数:10 大小:19.20KB
下载 相关 举报
hessian序列化规范.docx_第1页
第1页 / 共10页
hessian序列化规范.docx_第2页
第2页 / 共10页
hessian序列化规范.docx_第3页
第3页 / 共10页
hessian序列化规范.docx_第4页
第4页 / 共10页
hessian序列化规范.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

hessian序列化规范.docx

《hessian序列化规范.docx》由会员分享,可在线阅读,更多相关《hessian序列化规范.docx(10页珍藏版)》请在冰豆网上搜索。

hessian序列化规范.docx

hessian序列化规范

竭诚为您提供优质文档/双击可除

hessian,序列化规范

 

  篇一:

hessian介绍

  hessian概述hessian是一个轻量级的remotingonhttp工具,使用简单的方法提供了Rmi的功能。

相比webservice,hessian更简单、快捷。

采用的是二进制Rpc协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。

  hessian执行流程

  hessian一次完整调用

  hessian

  客户端时序

  hessianproxy是hessianclient处理客户端请求的核心类,它采用proxy的设计模式,代理客户端对远程接口的调用,hessianclient的主流程的时序图如下所示:

  hessian服务器端时序

  hessianskeleton是hessianserver端的核心类,从输入流中返序列化出客户端调用的方法和参数,对服务端服务进行调用,然后把处理结果返回给客户端,主要流程时序图如下所示:

  hessian序列化和反序列化

  结构类图

  1.

  2.

  3.

  4.serializer序列化的接口deserializer反序列化的接口abstracthessianinputhessian自定义的输入流,提供对应的read各种类型的方法abstracthessianoutputhessian自定义的输出流,提供对应的write各种类型的方法abstractserializerFactory介绍

  serializerFactory从字面意思上也看的出来,是管理和维护对应序列化/反序列化机制的工厂。

默认的几种实现

  serializerFactory标准的实现

  extserializerFactory我们可以设置自定义的序列化机制,通过该Factory可以进行扩展。

beanserializerFactory对serializerFactory的默认object的序列化机制进行强制指定,指定为

  beanserializer。

  

  实际运行当中使用的unsafeserializer和unsafedeserializer作为默认实现,在其中会有内部类Fielddeserializer和Fieldserializer来对应的处理对象内部的字段,如果出现unsafe内部支持的Fielddeserializer实现则会递归的进行对象序列化和反序列化处理。

  序列化流程

  1.根据对象类型获取对应的serializer实现(默认是unsafeserializer类),如果是基本类型直接调用对应serializer的writeobject方法写入输出流

  2.根据对象本地class反射获取对应的Field,循环Field获取对应Fieldserializer数组并设置到unsafeserializer

  3.调用unsafeserializer写入类的信息,循环对应的Fieldserializer数组进行写入信息(可能存在递归处理)

  4.关闭输出流

  反序列化流程

  1.根据输入流里面对象类型获取对应的对象定义objectdefinition

  2.类的类型获取对应的serializer实现(默认是unsafeserializer类),根据class反射获取对应Field,循环Field获取对应的Fielddeserializer数组并设置到unsafeserializer

  3.根据输入流获取对应类的字段数量长度并构建对应的object数组和string数组;循环此数组去对应类的serializer中寻找对应的Fielddeserializer,找不到的设置为nullFielddeserializer,同时根据流获取对应位置的字段名称

  4.根据以上信息构建objectdefinition对象

  5.根据class和objectdefinition创建对象实例

  6.循环objectdefinition的Fielddeserializer构建对应的Field(此处可能存在递归),调用对象反射注入属性,特别注意的是如果Fielddeserializer是nullFielddeserializer这个时候是从流里面读取一个对象,但是不会赋值给任何人。

  测试用例和结果

  查询返回结果序列化和反序列化

  1.1本地返回结果对象dto比服务器的字段少(基本类型或者自定义类型);结果:

正常处理

  1.2本地返回结果对象dto比服务器的字段多(基本类型或者自定义类型);结果:

正常处理,但是本地多出的字段都为null或者基本类型默认值

  1.3本地枚举类型比服务器枚举类型少值;结果:

返回异常

  1.4本地枚举类型比服务器枚举类型多值;结果:

正常处理

  请求入参序列化和反序列化

  1.1本地入参param比服务器少字段(基本类型或者自定义类型);结果:

正常处理,但是服务器比本地多出来的字段都为null或者基本类型默认值

  1.2本地入参param比服务器多字段(基本类型或者自定义类型);结果:

正常处理

  1.3本地枚举类型比服务器枚举类型少值;结果:

没有问题

  1.4本地枚举类型比服务器枚举类型多值;结果:

返回异常

  方法重载

  1.1方法名相同,入参个数不同;结果:

调用失败

  1.2方法名相同,入参类型不一样;结果:

调用失败

  注意事项

  1.对象要实现序列化接口java.io.serializable2.对象要提供无参构造方法3.接口不要使用方法重载

  知识点

  1.java动态代理

  2.递归与java继承、多态的结合

  3.工厂

  篇二:

hessian入门

  hessian入门

  Rmi(Remotemethodinvocation):

远程方法调用。

是一种机制,是java在jdk1.1中实现的,允许运行在一个java虚拟机的对象调用运行在另一个java虚拟机上的对象的方法。

如果想使机器中的对象能够被远程调用,它就必须实现远程接口。

  通俗地说,远程调用就象将一个class放在a机器上,然后在b机器中调用这个class的方法。

  先简单了解一下webservice

  webservice是一种跨编程语言和跨操作系统平台的远程调用技术。

例如:

c语言做的一个天气预报系统,可以通过暴露一个接口,然后在一个java语言做的系统上调用这个接口,从而可以在网页上显示天气预报服务。

  是基于soap(简单对象访问协议)方式实现。

  而hessian是一个轻量级的可以实现远程方法调用的一个工具,基于二进制Rpc协议方式实现的。

相比webservice,hessian更简单,效率更高。

  hessian的简单介绍:

  1、是基于什么协议实现的?

  基于binary-Rpc协议实现。

  2、怎么发起请求?

  需通过hessian本身提供的api来发起请求。

  3、怎么将请求转化为符合协议的格式的?

  hessian通过其自定义的串行化机制将请求信息进行序列化,产生二进制流。

  4、使用什么传输协议传输?

  hessian基于http协议进行传输。

  5、响应端基于什么机制来接收请求?

  响应端根据hessian提供的api来接收请求。

  6、怎么将流还原为传输格式的?

  hessian根据其私有的串行化机制来将请求信息进行反序列化,传递给使用者时已是相应的请求信息对象了。

  7、处理完毕后怎么回应?

  处理完毕后直接返回,hessian将结果对象进行序列化,传输至调用端。

  hessian开发是由服务端和客户端组成。

在进行基于hessian的项目开发时,应当注意以下几点:

  ▲jaVa服务器端必须具备以下几点:

  ·包含hessian的jar包

  ·设计一个接口,用来给客户端调用

  ·实现该接口的功能

  ·配置web.xml,配好相应的servlet

  ·由于使用二进制Rpc协议传输数据,对象必须进行序列化,实现serializable接口

  ·对于复杂对象可以使用map的方法传递

  ▲客户端必须具备以下几点:

  ·java客户端包含hessian.jar的包。

c#中引用hessiancsharp.dll

  ·具有和服务器端结构一样的接口。

包括命名空间都最好一样

  ·利用hessianproxyFactory调用远程接口。

  开发过程:

将下载的jar包引入项目中,创建一个接口,这个接口供客户端和服务器端使用,hessian远程访问基于其实就是按照此接口来进行序列化和反序列化。

  二、hessian调用实例

  a)编写服务端代码

  写一个接口:

  编写一个实现:

  配置web-inF.xml部署到web容器中:

  b)编写客户端代码

  执行客户端,即可返回相应的结果:

  远程调用结果:

helloworld

  篇三:

hessian使用方法

  java学习之hessian通信基础

  (20xx-11-2919:

37:

29)转载▼

  标签:

  java

  hessian

  通信

  rmi

  基础

  it

  一、首先先说hessian是什么?

  hessian:

hessian是一个轻量级的remotingonhttp工具,使用简单的方法提供了Rmi的功能,相比webservice,hessian更简单、快捷。

采用的是二进制Rpc协议,因为采用了二进制协议,所以它很适合于发送二进制数据,hessian主要作面向对象的消息通信。

hessian的初衷就是支持动态类型,格式紧凑,跨语言hessian是使用自己的序列化机制实现的编组和反编组,其支持的数据类型是有限制的,不支持复杂的对象,可以穿透防火墙,在这里不得不说一下Rmi:

Rmi是一组用户开发分布式应用程序的api。

他使用的是java序列化机制实现调用及返回值的编组于反编组。

它使用java语言接口定义了远程对象,它集合了java序列化和java远程方法协议(javaRemotemethodprotocol)。

他可以被看做是Rpc的java版本,因为传统的Rpc并不能很好的应用于分布式对象系统。

而javaRmi则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。

他也有它的缺点,他只能通过Rmi协议来进行访问无法通过http协议访问,无法穿透防火墙。

  还有一种远程调用方法就是Httpinvoker:

他也是将参数和返回值通过java的序列化机制进行编组和反编组,它具有Rmi的支持所有可序列化对象的优点。

试使用http协议传输二进制流的,同时又具有hessian、burlap(传输xml文本)的优点。

  二、写一个简单的hessian通信所需要知道写哪些内容?

  hessian:

写一个hessian需要注意的问题:

  1、jaVa服务器端必须具备以下几点:

分类:

java

  包含hessian的jar包

  设计一个接口,用来给客户端调用

  实现  

该接口的动能

  配置web.xml,配置相应的servlet

  对象必须实现serializable接口

  对于复杂对象可以使用map的方法传递

  2、客户端必须具备以下几点:

  java客户端包含hessian.jar包

  具有和服务器端结构一样的接口和实体类。

包括命名空间都最好一样。

利用hessianproxyFactory调用远程接口

  三、简单hessian实例:

  1、在服务端的接口:

  publicinterfaceihello{

  stringsayhello();

  }

  2、在服务端的实现类:

  publicclassihelloimplextendshessianservletimplementsihello{

  @override

  publicstringsayhello(){

  //todoauto-generatedmethodstub

  return"hello,ifromhessianservice";

  }

  }

  3、在客户端的类:

  publicclassclienttest{

  publicstaticstringurl=

  "http:

//127.0.0.1:

8080/hessianservice/hello";

  publicstaticvoidmain(string[]args){

  hessianproxyFactoryfactory=newhessianproxyFactory();try{

  ihelloihello=(ihello)factory.create(ihello.class,url);system.out.println(ihello.sayhello());

  }catch(malformeduRlexceptione){

  //todoauto-generatedcatchblock

  e.printstacktrace();

  }

  }

  }

  3、先将服务器端的类link到客户端,或者是将服务器端打包放到客户端,

  4、在web.xml中进行配置:

  服务器端:

  hello

  com.caucho.hessian.server.hessianservlet

  

    home-class

    com.kcpt.hessian.service.ihelloimpl

  

    home-api

    com.kcpt.hessian.service.ihello

  1

  

  

  hello

  /hello

  

  执行成功:

输出hello,ifromhessianservice,这是简单的hessian实现方式,看起来比较简单

  四、hessian与spring结合.

  在实际应用中,我们不只是简单的只使用hessian来进行通信的,如果方法多得话,还不如直接写在客户端来调用,然而:

当hessian与spring结合后,大大减少了这些操作,将dao层的操作全部放在hessian服务端,将业务逻辑全部放在hessian客户端,这样的话我们的hessian客户端和服务端完全分离,因此我们的业务逻辑和dao层就真正的达到了分离,就可以放在不同的服务器上,当然hessian的通信的作用不仅仅只有这些。

  接口和实现和上边的一样:

只是在web.xml中配置比较麻烦:

  例子:

  1、服务器端:

增加remoting-servlet.xml配置文件:

用来配置bean,并将bean导出为hessian服务:

  

    xmlns:

xsi="http:

//www.w3.org/20xx/xmlschema-instance"xmlns:

aop="http:

//www.springframework.org/schema/aop"xmlns:

tx="http:

//www.springframework.org/schema/tx"

  xsi:

schemalocation=

  "http:

//www.springframework.org/schema/beans

  http:

//www.springframework.org/schema/beans/spring-beans-2.0.xsdhttp:

//www.springframework.org/schema/aop

  http:

//www.springframework.org/schema/aop/spring-aop-2.0.xsd

  http:

//www.springframework.org/schema/tx

  http:

//www.springframework.org/schema/tx/spring-tx-2.0.xsd">

  

  

    class="org.springframework.remoting.caucho.hessianserviceexporter">

    

  

      value="com.kcpt.hessian.service.ihello"/>

  

  

  2、web.xml文件的配置:

  首先是监听器:

spring的监听器

  

  org.springframework.web.context.contextloaderlistener

  

  

    contextconfiglocation

    /web-inF/remoting-servlet.xml

    dispatcherservlet可将匹配模式的请求转发到hessian服务,web.xml只是定义了“请求转发器”,该转发器将匹配/remoting/*的请求截获,转发给context的bean处理。

而hessianserviceexporter提供bean服务。

-->

  remoting

  org.springframework.web.servlet.dispatcherservlet

  1

  

  

  remoting

  /remoting/*

  

  3、在客户端:

  同样要加spring监听器和context-param指定bean的文件

  声明bean的xml文件:

  

    "http:

//www.springframework.org/schema/beans

  http:

//www.springframework.org/schema/beans/spring-beans-2.0.xsdhttp:

//www.springframework.org/schema/aop

  http:

//www.springframework.org/schema/aop/spring-aop-2.0.xsdhttp:

//www.springframework.org/schema/tx

  http:

//www.springframework.org/schema/tx/spring-tx-2.0.xsd">  class="org.springframework.remoting.caucho.hessianproxyFactorybean">  //hessian的地址和名称请求转发的名称

  http:

//127.0.0.1:

8080/hessianservice/remoting

    //hessian所要调用的接口com.kcpt.hessian.service.ihello

  

  

  

  4、客户端的程序中要写:

  applicationcontextcontext=new

  classpathxmlapplicationcontext("com/kcpt/hessian/client/remoting-client.xml");//这里只是你声明的bean的xml文件所在的路径

  ihellob=(ihello)context.getbean("myserviceclient");来获取到ihello这个接口,从而就能够调用这个接口里的方法进行操作

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1