六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 76|回复: 0

hessian参数序列化过程

[复制链接]

升级  42%

3

主题

3

主题

3

主题

童生

Rank: 1

积分
21
 楼主| 发表于 2013-1-15 03:00:04 | 显示全部楼层 |阅读模式
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
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表