`
eils2000
  • 浏览: 50192 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

hessian参数序列化过程

OS 
阅读更多

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

分享到:
评论

相关推荐

    Hessian应用

    3. **网络通信**:当调用代理方法时,Hessian会自动将参数序列化,通过HTTP发送到服务端;服务端接收到请求后,反序列化参数,执行相应的方法,然后将结果序列化并返回给客户端。 4. **处理结果**:客户端接收到...

    Hessian学习简单demo

    3. **序列化服务**:Hessian会自动处理服务接口的序列化,将方法名和参数编码为二进制流。 4. **启动服务器**:运行服务器程序,它将在后台等待客户端的连接和请求。 5. **创建客户端**:在客户端,我们需要创建一...

    hessian轻量级 rpc实现

    当客户端发起请求时,它会将参数对象序列化成二进制流,通过HTTP POST发送到服务器。服务器端接收到二进制流后,进行反序列化恢复为原始对象,然后执行相应的服务方法,最后将结果序列化回二进制流返回给客户端。...

    Java 序列化的秘密(高清PDF中文版)

    为了解决这个问题,可以在类中添加一个`readResolve()`方法,该方法会在反序列化过程中被调用,用于返回正确的单例实例。 #### 同引用实例化问题 在序列化过程中,如果两个对象引用同一个对象实例,则在反序列化时...

    dubbo-exp:Dubbo反序列化一键快速攻击测试工具,支持dubbo协议和http协议,支持hessian反序列化和java原生反序列化

    a --args gadget入参,多个参数使用多次该命令传入,例-a -a Calc-p --protocol [dubbo|http] 通讯协议名称,默认缺省dubbo-s --serialization [hessian|java] 序列化类型,默认缺省hessian-t --target 目标,例:...

    hessian vc实现

    Hessian是一种高效的二进制序列化协议,常用于网络通信,特别是远程方法调用(RPC)服务。在VC(Visual C++)环境下实现Hessian客户端,可以让你的应用程序与使用Hessian服务端进行高效的数据交换。本文将详细介绍...

    Hessian学习笔记

    1. **二进制序列化**:Hessian使用高效的二进制格式进行序列化和反序列化,与基于文本的序列化协议(如JSON或XML)相比,它能显著减少网络传输的数据量。二进制序列化的优势在于数据紧凑,解析速度快,但同时也降低...

    hessian包及一个简单的使用实例

    1. **二进制序列化**:Hessian使用高效的二进制格式进行序列化和反序列化,与XML或JSON相比,这种格式的数据体积更小,网络传输更快。 2. **类型安全**:Hessian支持各种数据类型,包括基本类型、对象、数组和映射...

    hessian简单实例

    - 调用这个代理对象的方法,Hessian会自动将方法调用和参数序列化成字节流,通过HTTP发送给服务器,然后等待服务器的响应,将返回的结果反序列化为原生类型。 3. **Hessian协议特点**: - **二进制格式**:...

    java+hessian 远程调用

    - **简洁高效**:Hessian的协议设计使得序列化和反序列化过程非常快速,适合高并发环境。 - **支持基本类型和复杂对象**:不仅可以处理基本数据类型,还可以序列化和反序列化Java对象,包括集合和自定义类。 4. *...

    hessian

    它结合了HTTP协议的可扩展性和Java序列化机制的易用性,使得在分布式系统中传输复杂对象变得简单而高效。 Hessian协议的核心特点包括: 1. **二进制格式**:Hessian使用紧凑的二进制格式,相比基于文本的协议如XML-...

    hessian服务端 客户端 可运行

    此外,Hessian还支持基本类型的序列化和反序列化,对于Java对象的透明传输也有很好的支持。然而,Hessian也有其局限性,比如不支持跨语言通信(主要是因为它是Java特有的),并且其二进制格式并非公开标准,可能限制...

    Hessian 接口 Java Python.docx

    在Hessian 2.0的"call"中指定要调用的方法,方法参数通过call传递,并使用Hessian 2.0序列化协议进行序列化。如果方法调用成功,返回值也会使用Hessian 2.0序列化并发送给客户端;如果调用失败,服务器会向客户端...

    android端使用hessian跟web服务器通讯

    Hessian是由Caucho公司开发的一种轻量级的二进制Remoting协议,它提供了高效的序列化和反序列化机制,使得跨平台的远程方法调用(RMI)变得更加便捷。Hessian支持HTTP传输,可以在防火墙开放的HTTP端口上进行通信,...

    hessian最新源码分析.pdf

    源码中包含了方法名缓存、特殊方法的本地处理、以及序列化和反序列化的实现,这些都是Hessian能够高效、可靠地进行RPC通信的关键所在。通过理解这些源码,我们可以更好地优化Hessian的使用,提升远程服务调用的性能...

    Hessian调用

    Hessian协议是一种序列化协议,它将Java对象转换为二进制流,从而在网络上传输,到达目的地后再反序列化回原来的对象。这种二进制格式比XML或JSON更紧凑,因此在网络传输中效率更高。Hessian不仅支持基本数据类型,...

    hessian 实例

    远程调用方法就是HttpInvoker:他也是将参数和返回值通过Java的序列化机制进行编组和反编组,它具有RMI的支持所有可序列化对象的优点。试使用Http协议传输二进制流的,同时又具有Hessian、Burlap(传输xml文本)的...

    基于混合分析的Java反序列化利用链挖掘方法.docx

    通过这种方式,攻击者可以控制反序列化过程中的执行流程,最终实现执行任意代码的目标。因此,自动挖掘有效的反序列化利用链成为了研究的关键。 #### 二、Java反序列化的基本概念 序列化是将Java对象转换为可存储...

    Hessian例子.doc

    - 当客户端调用代理对象的`say`方法时,Hessian会将方法调用和参数序列化成二进制流,通过HTTP发送到服务端。 - 服务端接收到请求后,由`HessianServlet`解析二进制流,反序列化成方法调用和参数,并执行对应的`...

Global site tag (gtag.js) - Google Analytics