hessian序列化规范Word文档格式.docx
《hessian序列化规范Word文档格式.docx》由会员分享,可在线阅读,更多相关《hessian序列化规范Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
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.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
通信
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,ifromhessianservice,这是简单的hessian实现方式,看起来比较简单
四、hessian与spring结合.
在实际应用中,我们不只是简单的只使用hessian来进行通信的,如果方法多得话,还不如直接写在客户端来调用,然而:
当hessian与spring结合后,大大减少了这些操作,将dao层的操作全部放在hessian服务端,将业务逻辑全部放在hessian客户端,这样的话我们的hessian客户端和服务端完全分离,因此我们的业务逻辑和dao层就真正的达到了分离,就可以放在不同的服务器上,当然hessian的通信的作用不仅仅只有这些。
接口和实现和上边的一样:
只是在web.xml中配置比较麻烦:
例子:
1、服务器端:
增加remoting-servlet.xml配置文件:
用来配置bean,并将bean导出为hessian服务:
xmlns:
xsi="
//www.w3.org/20xx/xmlschema-instance"
xmlns:
aop="
//www.springframework.org/schema/aop"
tx="
//www.springframework.org/schema/tx"
xsi:
schemalocation=
//www.springframework.org/schema/beans
http:
//www.springframework.org/schema/beans/spring-beans-2.0.xsdhttp:
//www.springframework.org/schema/aop
//www.springframework.org/schema/aop/spring-aop-2.0.xsd
//www.springframework.org/schema/tx
//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
/remoting/*
3、在客户端:
同样要加spring监听器和context-param指定bean的文件
声明bean的xml文件:
"
//www.springframework.org/schema/aop/spring-aop-2.0.xsdhttp:
class="
org.springframework.remoting.caucho.hessianproxyFactorybean"
//hessian的地址和名称请求转发的名称
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这个接口,从而就能够调用这个接口里的方法进行操作