private static Type[] GetSerializableTypes() { HashSet <Type> hashSet = new HashSet <Type>(); try { foreach (Type type in DxBinarySerializationUtil.expectedTypes) { DxBinarySerializationUtil.ExpandSerializableTypes(hashSet, type); } } catch (Exception ex) { DxBinarySerializationUtil.LogErr("SerializationTypeBinder initialize type in current appdomain failed: {0}.", new object[] { ex.ToString() }); } return(hashSet.ToArray <Type>()); }
private static void ExpandSerializableTypes(HashSet <Type> serializableTypes, Type type) { if (serializableTypes.Contains(type)) { return; } serializableTypes.Add(type); try { if (type.IsArray) { DxBinarySerializationUtil.ExpandSerializableTypes(serializableTypes, type.GetElementType()); } } catch (Exception ex) { DxBinarySerializationUtil.LogErr("SerializationTypeBinder load array element type on type {0} failed: {1}.", new object[] { type.FullName, ex.ToString() }); } try { if (type.IsConstructedGenericType) { foreach (Type type2 in type.GetGenericArguments()) { DxBinarySerializationUtil.ExpandSerializableTypes(serializableTypes, type2); } } } catch (Exception ex2) { DxBinarySerializationUtil.LogErr("SerializationTypeBinder load generic type definition on type {0} failed: {1}.", new object[] { type.FullName, ex2.ToString() }); } try { FieldInfo[] fields = type.GetFields(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); if (fields != null && fields.Length > 0) { foreach (FieldInfo fieldInfo in from x in fields where !x.IsNotSerialized && !serializableTypes.Contains(x.FieldType) && x.FieldType.IsSerializable select x) { try { DxBinarySerializationUtil.ExpandSerializableTypes(serializableTypes, fieldInfo.FieldType); } catch (Exception ex3) { DxBinarySerializationUtil.LogErr("SerializationTypeBinder load field {0} on type {1} failed: {2}.", new object[] { fieldInfo.Name, type.FullName, ex3.ToString() }); } } } } catch (Exception ex4) { DxBinarySerializationUtil.LogErr("SerializationTypeBinder load fields on type {0} failed: {1}.", new object[] { type.FullName, ex4.ToString() }); } try { PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (properties != null && properties.Length > 0) { foreach (PropertyInfo propertyInfo in properties) { try { DxBinarySerializationUtil.ExpandSerializableTypes(serializableTypes, propertyInfo.PropertyType); } catch (Exception ex5) { DxBinarySerializationUtil.LogErr("SerializationTypeBinder load property {0} on type {1} failed: {2}.", new object[] { propertyInfo.Name, type.FullName, ex5.ToString() }); } } } } catch (Exception ex6) { DxBinarySerializationUtil.LogErr("SerializationTypeBinder load properties on type {0} failed: {1}.", new object[] { type.FullName, ex6.ToString() }); } try { if (type.BaseType != null && type.BaseType != typeof(object)) { DxBinarySerializationUtil.ExpandSerializableTypes(serializableTypes, type.BaseType); } } catch (Exception ex7) { DxBinarySerializationUtil.LogErr("SerializationTypeBinder load base type on type {0} failed: {1}.", new object[] { type.FullName, ex7.ToString() }); } }