public GenericClassSerializer GetFieldSerializer(FieldInfo field) { GenericClassSerializer ret = null; Type fieldType = field.FieldType; if (fieldType.IsGenericType && ((fieldType.GetGenericTypeDefinition() == typeof(IList<>)) || (fieldType.GetGenericTypeDefinition() == typeof(List<>)))) { POxOSerializerClassPair pair = new POxOSerializerClassPair(); recirsiveFindSerializer(fieldType, pair); ret = pair.getSerializer(); } else if (fieldType.IsGenericType && ((fieldType.GetGenericTypeDefinition() == typeof(IDictionary<,>)) || (fieldType.GetGenericTypeDefinition() == typeof(Dictionary<,>)))) { POxOSerializerClassPair pair = new POxOSerializerClassPair(); recirsiveFindSerializer(fieldType, pair); ret = pair.getSerializer(); } else { ret = GetTypeSerializer(fieldType); } return ret; }
private void recirsiveFindSerializer(Type genericType, POxOSerializerClassPair pair) { if (!genericType.IsGenericType) { pair.setGenericClass(genericType); pair.setSerializer(GetTypeSerializer(genericType)); } else { Type[] genericTypes = genericType.GetGenericArguments(); POxOSerializerClassPair[] nestedPairs = new POxOSerializerClassPair[genericTypes.Length]; for (int i = 0; i < genericTypes.Length; i++) { Type actualType = genericTypes[i]; POxOSerializerClassPair nestedPair = new POxOSerializerClassPair(); recirsiveFindSerializer(actualType, nestedPair); nestedPairs[i] = nestedPair; } if ((genericType.GetGenericTypeDefinition() == typeof(IList<>)) || (genericType.GetGenericTypeDefinition() == typeof(List<>))) { pair.setGenericClass(genericType); pair.setSerializer(new ListSerializer(nestedPairs[0].getGenericClass(), nestedPairs[0].getSerializer())); } else { if ((genericType.GetGenericTypeDefinition() == typeof(IDictionary<,>)) || (genericType.GetGenericTypeDefinition() == typeof(Dictionary<,>))) { pair.setGenericClass(genericType); pair.setSerializer(new MapSerializer(nestedPairs[0].getGenericClass(), nestedPairs[1].getGenericClass(), nestedPairs[0].getSerializer(), nestedPairs[1].getSerializer())); } } } //if (genericType instanceof GenericArrayType) { // Type componentType = ((GenericArrayType) genericType).getGenericComponentType(); // if (componentType instanceof Type) { // pair.setGenericClass((Type) componentType); // pair.setSerializer(new ListSerializer((Type) componentType, getTypeSerializer((Type) componentType))); // return; // } else { // POxOSerializerClassPair nestedPair = new POxOSerializerClassPair(); // recirsiveFindSerializer(componentType, nestedPair); // pair.setGenericClass(nestedPair.getGenericClass()); // pair.setSerializer(new ListSerializer(nestedPair.getGenericClass(), // nestedPair.getSerializer())); // return; // } //} //if (genericType instanceof ParameterizedType) { // Type[] actualTypes = ((ParameterizedType) genericType).getActualTypeArguments(); // Type genericClass = (Type) ((ParameterizedType) genericType).getRawType(); // if (Map.class.isAssignableFrom(genericClass)) { // POxOSerializerClassPair[] serializers = new POxOSerializerClassPair[actualTypes.length]; // for (int i = 0, n = actualTypes.length; i < n; i++) { // Type actualType = actualTypes[i]; // if (actualType instanceof Type) { // POxOSerializerClassPair nestedPair = new POxOSerializerClassPair(); // nestedPair.setGenericClass((Type) actualType); // nestedPair.setSerializer(getTypeSerializer((Type) actualType)); // serializers[i] = nestedPair; // } else if (actualType instanceof ParameterizedType) { // POxOSerializerClassPair nestedPair = new POxOSerializerClassPair(); // recirsiveFindSerializer(actualType, nestedPair); // serializers[i] = nestedPair; // } else // continue; // } // pair.setGenericClass((Type) ((ParameterizedType) genericType).getRawType()); // pair.setSerializer(new MapSerializer(serializers[0].getGenericClass(), // serializers[1].getGenericClass(), serializers[0].getSerializer(), // serializers[1].getSerializer())); // } else if (List.class.isAssignableFrom(genericClass)) { // for (int i = 0, n = actualTypes.length; i < n; i++) { // Type actualType = actualTypes[i]; // if (actualType instanceof Type) { // pair.setGenericClass((Type) ((ParameterizedType) genericType).getRawType()); // pair.setSerializer(new ListSerializer((Type) actualType, getTypeSerializer((Type) actualType))); // } else if (actualType instanceof ParameterizedType) { // POxOSerializerClassPair nestedPair = new POxOSerializerClassPair(); // recirsiveFindSerializer(actualType, nestedPair); // pair.setGenericClass((Type) ((ParameterizedType) genericType).getRawType()); // pair.setSerializer(new ListSerializer(nestedPair.getGenericClass(), // nestedPair.getSerializer())); // } else // continue; // } // } //} }