eils2000 发表于 2013-1-15 03:00:04

hessian参数序列化过程

hessian协议在调用api的时候会对参数进行序列化:
AbstractHessianOutput out = hessianClient.getHessianOutput(os);out.call(methodName, args);out.flush(); 在out.call(methodName,args)的过程中hessian对args进行了序列化:
//com.caucho.hessian.io.HessianOutputpublic void call(String method, Object []args)    throws IOException{    startCall(method);      if (args != null) {      for (int i = 0; i < args.length; i++)      writeObject(args);    }      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
页: [1]
查看完整版本: hessian参数序列化过程