hessian协议在调用api的时候会对参数进行序列化:
AbstractHessianOutput out = hessianClient.getHessianOutput(os);
out.call(methodName, args);
out.flush();
在out.call(methodName,args)的过程中hessian对args进行了序列化:
//com.caucho.hessian.io.HessianOutput
public void call(String method, Object []args)
throws IOException
{
startCall(method);
if (args != null) {
for (int i = 0; i < args.length; i++)
writeObject(args[i]);
}
completeCall();
}
/**
* 调用序列化器对参数进行序列化
*/
public void writeObject(Object object)
throws IOException
{
if (object == null) {
writeNull();
return;
}
Serializer serializer;
serializer = _serializerFactory.getSerializer(object.getClass());
serializer.writeObject(object, this);
}
hessian的序列化器工厂类:com.caucho.hessian.io.SerializerFactory
public Serializer getSerializer(Class cl)
throws HessianProtocolException
{
Serializer serializer;
serializer = (Serializer) _staticSerializerMap.get(cl);
if (serializer != null)
return serializer;
if (_cachedSerializerMap != null) {
synchronized (_cachedSerializerMap) {
serializer = (Serializer) _cachedSerializerMap.get(cl);
}
if (serializer != null)
return serializer;
}
for (int i = 0;
serializer == null && _factories != null && i < _factories.size();
i++) {
AbstractSerializerFactory factory;
factory = (AbstractSerializerFactory) _factories.get(i);
serializer = factory.getSerializer(cl);
}
if (serializer != null) {
}
else if (JavaSerializer.getWriteReplace(cl) != null)
serializer = new JavaSerializer(cl);
else if (HessianRemoteObject.class.isAssignableFrom(cl))
serializer = new RemoteSerializer();
else if (BurlapRemoteObject.class.isAssignableFrom(cl))
serializer = new RemoteSerializer();
else if (Map.class.isAssignableFrom(cl)) {
if (_mapSerializer == null)
_mapSerializer = new MapSerializer();
serializer = _mapSerializer;
}
else if (Collection.class.isAssignableFrom(cl)) {
if (_collectionSerializer == null) {
_collectionSerializer = new CollectionSerializer();
}
serializer = _collectionSerializer;
}
else if (cl.isArray())
serializer = new ArraySerializer();
else if (Throwable.class.isAssignableFrom(cl))
serializer = new ThrowableSerializer(cl);
else if (InputStream.class.isAssignableFrom(cl))
serializer = new InputStreamSerializer();
else if (Iterator.class.isAssignableFrom(cl))
serializer = IteratorSerializer.create();
else if (Enumeration.class.isAssignableFrom(cl))
serializer = EnumerationSerializer.create();
else if (Calendar.class.isAssignableFrom(cl))
serializer = CalendarSerializer.create();
else if (Locale.class.isAssignableFrom(cl))
serializer = LocaleSerializer.create();
else if (Enum.class.isAssignableFrom(cl))
serializer = new EnumSerializer(cl);
if (serializer == null)
serializer = getDefaultSerializer(cl);
if (_cachedSerializerMap == null)
_cachedSerializerMap = new HashMap(8);
synchronized (_cachedSerializerMap) {
_cachedSerializerMap.put(cl, serializer);
}
return serializer;
}
从这里大家可以看到Hessain支持的参数类型,如果不支持就会抛出:
Hessian exception:Serialized class #classFullName# must implement java.io.Serializable
分享到:
相关推荐
3. **网络通信**:当调用代理方法时,Hessian会自动将参数序列化,通过HTTP发送到服务端;服务端接收到请求后,反序列化参数,执行相应的方法,然后将结果序列化并返回给客户端。 4. **处理结果**:客户端接收到...
3. **序列化服务**:Hessian会自动处理服务接口的序列化,将方法名和参数编码为二进制流。 4. **启动服务器**:运行服务器程序,它将在后台等待客户端的连接和请求。 5. **创建客户端**:在客户端,我们需要创建一...
当客户端发起请求时,它会将参数对象序列化成二进制流,通过HTTP POST发送到服务器。服务器端接收到二进制流后,进行反序列化恢复为原始对象,然后执行相应的服务方法,最后将结果序列化回二进制流返回给客户端。...
为了解决这个问题,可以在类中添加一个`readResolve()`方法,该方法会在反序列化过程中被调用,用于返回正确的单例实例。 #### 同引用实例化问题 在序列化过程中,如果两个对象引用同一个对象实例,则在反序列化时...
a --args gadget入参,多个参数使用多次该命令传入,例-a -a Calc-p --protocol [dubbo|http] 通讯协议名称,默认缺省dubbo-s --serialization [hessian|java] 序列化类型,默认缺省hessian-t --target 目标,例:...
Hessian是一种高效的二进制序列化协议,常用于网络通信,特别是远程方法调用(RPC)服务。在VC(Visual C++)环境下实现Hessian客户端,可以让你的应用程序与使用Hessian服务端进行高效的数据交换。本文将详细介绍...
1. **二进制序列化**:Hessian使用高效的二进制格式进行序列化和反序列化,与基于文本的序列化协议(如JSON或XML)相比,它能显著减少网络传输的数据量。二进制序列化的优势在于数据紧凑,解析速度快,但同时也降低...
1. **二进制序列化**:Hessian使用高效的二进制格式进行序列化和反序列化,与XML或JSON相比,这种格式的数据体积更小,网络传输更快。 2. **类型安全**:Hessian支持各种数据类型,包括基本类型、对象、数组和映射...
- 调用这个代理对象的方法,Hessian会自动将方法调用和参数序列化成字节流,通过HTTP发送给服务器,然后等待服务器的响应,将返回的结果反序列化为原生类型。 3. **Hessian协议特点**: - **二进制格式**:...
- **简洁高效**:Hessian的协议设计使得序列化和反序列化过程非常快速,适合高并发环境。 - **支持基本类型和复杂对象**:不仅可以处理基本数据类型,还可以序列化和反序列化Java对象,包括集合和自定义类。 4. *...
它结合了HTTP协议的可扩展性和Java序列化机制的易用性,使得在分布式系统中传输复杂对象变得简单而高效。 Hessian协议的核心特点包括: 1. **二进制格式**:Hessian使用紧凑的二进制格式,相比基于文本的协议如XML-...
此外,Hessian还支持基本类型的序列化和反序列化,对于Java对象的透明传输也有很好的支持。然而,Hessian也有其局限性,比如不支持跨语言通信(主要是因为它是Java特有的),并且其二进制格式并非公开标准,可能限制...
在Hessian 2.0的"call"中指定要调用的方法,方法参数通过call传递,并使用Hessian 2.0序列化协议进行序列化。如果方法调用成功,返回值也会使用Hessian 2.0序列化并发送给客户端;如果调用失败,服务器会向客户端...
Hessian是由Caucho公司开发的一种轻量级的二进制Remoting协议,它提供了高效的序列化和反序列化机制,使得跨平台的远程方法调用(RMI)变得更加便捷。Hessian支持HTTP传输,可以在防火墙开放的HTTP端口上进行通信,...
源码中包含了方法名缓存、特殊方法的本地处理、以及序列化和反序列化的实现,这些都是Hessian能够高效、可靠地进行RPC通信的关键所在。通过理解这些源码,我们可以更好地优化Hessian的使用,提升远程服务调用的性能...
Hessian协议是一种序列化协议,它将Java对象转换为二进制流,从而在网络上传输,到达目的地后再反序列化回原来的对象。这种二进制格式比XML或JSON更紧凑,因此在网络传输中效率更高。Hessian不仅支持基本数据类型,...
远程调用方法就是HttpInvoker:他也是将参数和返回值通过Java的序列化机制进行编组和反编组,它具有RMI的支持所有可序列化对象的优点。试使用Http协议传输二进制流的,同时又具有Hessian、Burlap(传输xml文本)的...
通过这种方式,攻击者可以控制反序列化过程中的执行流程,最终实现执行任意代码的目标。因此,自动挖掘有效的反序列化利用链成为了研究的关键。 #### 二、Java反序列化的基本概念 序列化是将Java对象转换为可存储...
- 当客户端调用代理对象的`say`方法时,Hessian会将方法调用和参数序列化成二进制流,通过HTTP发送到服务端。 - 服务端接收到请求后,由`HessianServlet`解析二进制流,反序列化成方法调用和参数,并执行对应的`...