2222import org .apache .dubbo .common .serialize .MultipleSerialization ;
2323import org .apache .dubbo .common .serialize .support .DefaultSerializationSelector ;
2424import org .apache .dubbo .common .stream .StreamObserver ;
25- import org .apache .dubbo .common .utils .ClassUtils ;
2625import org .apache .dubbo .config .Constants ;
2726import org .apache .dubbo .rpc .model .MethodDescriptor ;
2827import org .apache .dubbo .rpc .model .PackableMethod ;
3433import java .io .IOException ;
3534import java .lang .reflect .ParameterizedType ;
3635import java .util .Iterator ;
37- import java .util .Map ;
38- import java .util .concurrent .ConcurrentHashMap ;
36+ import java .util .stream .Stream ;
3937
4038import static org .apache .dubbo .common .constants .CommonConstants .$ECHO ;
4139import static org .apache .dubbo .common .constants .CommonConstants .PROTOBUF_MESSAGE_CLASS_NAME ;
@@ -93,7 +91,8 @@ public ReflectionPackableMethod(MethodDescriptor method, URL url, String seriali
9391 .getExtension (url .getParameter (Constants .MULTI_SERIALIZATION_KEY ,
9492 CommonConstants .DEFAULT_KEY ));
9593
96- this .requestPack = new WrapRequestPack (serialization , url , serializeName , singleArgument );
94+ this .requestPack = new WrapRequestPack (serialization , url , serializeName , actualRequestTypes ,
95+ singleArgument );
9796 this .responsePack = new WrapResponsePack (serialization , url , actualResponseType );
9897 this .requestUnpack = new WrapRequestUnpack (serialization , url , actualRequestTypes );
9998 this .responseUnpack = new WrapResponseUnpack (serialization , url , actualResponseType );
@@ -323,16 +322,10 @@ private WrapResponsePack(MultipleSerialization multipleSerialization, URL url,
323322 @ Override
324323 public byte [] pack (Object obj ) throws IOException {
325324 ByteArrayOutputStream bos = new ByteArrayOutputStream ();
326- Class <?> clz ;
327- if (obj != null ) {
328- clz = obj .getClass ();
329- } else {
330- clz = actualResponseType ;
331- }
332- multipleSerialization .serialize (url , serialize , clz , obj , bos );
325+ multipleSerialization .serialize (url , serialize , actualResponseType , obj , bos );
333326 return TripleCustomerProtocolWapper .TripleResponseWrapper .Builder .newBuilder ()
334327 .setSerializeType (serialize )
335- .setType (clz .getName ())
328+ .setType (actualResponseType .getName ())
336329 .setData (bos .toByteArray ())
337330 .build ()
338331 .toByteArray ();
@@ -341,17 +334,15 @@ public byte[] pack(Object obj) throws IOException {
341334
342335 private static class WrapResponseUnpack implements UnPack {
343336
344- private final Map <String , Class <?>> classCache = new ConcurrentHashMap <>();
345-
346337 private final MultipleSerialization serialization ;
347338 private final URL url ;
339+ private final Class <?> returnClass ;
348340
349- private final Class <?> actualResponseType ;
350341
351- private WrapResponseUnpack (MultipleSerialization serialization , URL url , Class <?> actualResponseType ) {
342+ private WrapResponseUnpack (MultipleSerialization serialization , URL url , Class <?> returnClass ) {
352343 this .serialization = serialization ;
353344 this .url = url ;
354- this .actualResponseType = actualResponseType ;
345+ this .returnClass = returnClass ;
355346 }
356347
357348 @ Override
@@ -360,25 +351,27 @@ public Object unpack(byte[] data) throws IOException, ClassNotFoundException {
360351 .parseFrom (data );
361352 final String serializeType = convertHessianFromWrapper (wrapper .getSerializeType ());
362353 ByteArrayInputStream bais = new ByteArrayInputStream (wrapper .getData ());
363- Class <?> clz = getClassFromCache (wrapper .getType (), classCache , actualResponseType );
364- return serialization .deserialize (url , serializeType , clz , bais );
354+ return serialization .deserialize (url , serializeType , returnClass , bais );
365355 }
366356 }
367357
368358 private static class WrapRequestPack implements Pack {
369359
370360 private final String serialize ;
371361 private final MultipleSerialization multipleSerialization ;
362+ private final String [] argumentsType ;
372363 private final URL url ;
373364 private final boolean singleArgument ;
374365
375366 private WrapRequestPack (MultipleSerialization multipleSerialization ,
376367 URL url ,
377368 String serialize ,
369+ Class <?>[] actualRequestTypes ,
378370 boolean singleArgument ) {
379371 this .url = url ;
380372 this .serialize = convertHessianToWrapper (serialize );
381373 this .multipleSerialization = multipleSerialization ;
374+ this .argumentsType = Stream .of (actualRequestTypes ).map (Class ::getName ).toArray (String []::new );
382375 this .singleArgument = singleArgument ;
383376 }
384377
@@ -392,8 +385,10 @@ public byte[] pack(Object obj) throws IOException {
392385 }
393386 final TripleCustomerProtocolWapper .TripleRequestWrapper .Builder builder = TripleCustomerProtocolWapper .TripleRequestWrapper .Builder .newBuilder ();
394387 builder .setSerializeType (serialize );
388+ for (String type : argumentsType ) {
389+ builder .addArgTypes (type );
390+ }
395391 for (Object argument : arguments ) {
396- builder .addArgTypes (argument .getClass ().getName ());
397392 ByteArrayOutputStream bos = new ByteArrayOutputStream ();
398393 multipleSerialization .serialize (url , serialize , argument .getClass (), argument , bos );
399394 builder .addArgs (bos .toByteArray ());
@@ -436,8 +431,6 @@ public byte[] pack(Object obj) throws IOException {
436431
437432 private class WrapRequestUnpack implements UnPack {
438433
439- private final Map <String , Class <?>> classCache = new ConcurrentHashMap <>();
440-
441434 private final MultipleSerialization serialization ;
442435 private final URL url ;
443436
@@ -458,32 +451,11 @@ public Object unpack(byte[] data) throws IOException, ClassNotFoundException {
458451 for (int i = 0 ; i < wrapper .getArgs ().size (); i ++) {
459452 ByteArrayInputStream bais = new ByteArrayInputStream (
460453 wrapper .getArgs ().get (i ));
461- String className = wrapper . getArgTypes (). get ( i );
462- Class <?> clz = getClassFromCache ( className , classCache , actualRequestTypes [i ]);
463- ret [ i ] = serialization . deserialize ( url , wrapper . getSerializeType (), clz , bais );
454+ ret [ i ] = serialization . deserialize ( url , wrapper . getSerializeType (),
455+ actualRequestTypes [i ],
456+ bais );
464457 }
465458 return ret ;
466459 }
467-
468-
469- }
470-
471-
472- private static Class <?> getClassFromCache (String className , Map <String , Class <?>> classCache , Class <?> expectedClass ) {
473- if (expectedClass .getName ().equals (className )) {
474- return expectedClass ;
475- }
476-
477- Class <?> clz = classCache .get (className );
478- if (clz == null ) {
479- try {
480- clz = ClassUtils .forName (className );
481- } catch (Exception e ) {
482- // To catch IllegalStateException, LinkageError, ClassNotFoundException
483- clz = expectedClass ;
484- }
485- classCache .put (className , clz );
486- }
487- return clz ;
488460 }
489461}
0 commit comments