private static void deserializeInternal()

in dubbo-common/src/main/java/org/apache/dubbo/common/beanutil/JavaBeanSerializeUtil.java [218:306]


    private static void deserializeInternal(
            Object result,
            JavaBeanDescriptor beanDescriptor,
            ClassLoader loader,
            IdentityHashMap<JavaBeanDescriptor, Object> cache) {
        if (beanDescriptor.isEnumType() || beanDescriptor.isClassType() || beanDescriptor.isPrimitiveType()) {
            return;
        }

        if (beanDescriptor.isArrayType()) {
            int index = 0;
            for (Map.Entry<Object, Object> entry : beanDescriptor) {
                Object item = entry.getValue();
                if (item instanceof JavaBeanDescriptor) {
                    JavaBeanDescriptor itemDescriptor = (JavaBeanDescriptor) entry.getValue();
                    item = instantiateForDeserialize(itemDescriptor, loader, cache);
                    deserializeInternal(item, itemDescriptor, loader, cache);
                }
                Array.set(result, index++, item);
            }
        } else if (beanDescriptor.isCollectionType()) {
            Collection collection = (Collection) result;
            for (Map.Entry<Object, Object> entry : beanDescriptor) {
                Object item = entry.getValue();
                if (item instanceof JavaBeanDescriptor) {
                    JavaBeanDescriptor itemDescriptor = (JavaBeanDescriptor) entry.getValue();
                    item = instantiateForDeserialize(itemDescriptor, loader, cache);
                    deserializeInternal(item, itemDescriptor, loader, cache);
                }
                collection.add(item);
            }
        } else if (beanDescriptor.isMapType()) {
            Map map = (Map) result;
            for (Map.Entry<Object, Object> entry : beanDescriptor) {
                Object key = entry.getKey();
                Object value = entry.getValue();
                if (key instanceof JavaBeanDescriptor) {
                    JavaBeanDescriptor keyDescriptor = (JavaBeanDescriptor) entry.getKey();
                    key = instantiateForDeserialize(keyDescriptor, loader, cache);
                    deserializeInternal(key, keyDescriptor, loader, cache);
                }
                if (value instanceof JavaBeanDescriptor) {
                    JavaBeanDescriptor valueDescriptor = (JavaBeanDescriptor) entry.getValue();
                    value = instantiateForDeserialize(valueDescriptor, loader, cache);
                    deserializeInternal(value, valueDescriptor, loader, cache);
                }
                map.put(key, value);
            }
        } else if (beanDescriptor.isBeanType()) {
            for (Map.Entry<Object, Object> entry : beanDescriptor) {
                String property = entry.getKey().toString();
                Object value = entry.getValue();
                if (value == null) {
                    continue;
                }

                if (value instanceof JavaBeanDescriptor) {
                    JavaBeanDescriptor valueDescriptor = (JavaBeanDescriptor) entry.getValue();
                    value = instantiateForDeserialize(valueDescriptor, loader, cache);
                    deserializeInternal(value, valueDescriptor, loader, cache);
                }

                Method method = getSetterMethod(result.getClass(), property, value.getClass());
                boolean setByMethod = false;
                try {
                    if (method != null) {
                        method.invoke(result, value);
                        setByMethod = true;
                    }
                } catch (Exception e) {
                    LogHelper.warn(logger, "Failed to set property through method " + method, e);
                }

                if (!setByMethod) {
                    try {
                        Field field = result.getClass().getField(property);
                        if (field != null) {
                            field.set(result, value);
                        }
                    } catch (NoSuchFieldException | IllegalAccessException e1) {
                        LogHelper.warn(logger, "Failed to set field value", e1);
                    }
                }
            }
        } else {
            throw new IllegalArgumentException(
                    "Unsupported type " + beanDescriptor.getClassName() + ":" + beanDescriptor.getType());
        }
    }