private void DetermineSerializationCapabilities() { if ((ClassType & (ClassType.Enumerable | ClassType.Dictionary)) == 0) { // We serialize if there is a getter + not ignoring readonly properties. ShouldSerialize = HasGetter && (HasSetter || !Options.IgnoreReadOnlyProperties); // We deserialize if there is a setter. ShouldDeserialize = HasSetter; } else { if (HasGetter) { ShouldSerialize = true; if (HasSetter) { ShouldDeserialize = true; if (RuntimePropertyType.IsArray) { // Verify that we don't have a multidimensional array. if (RuntimePropertyType.GetArrayRank() > 1) { throw ThrowHelper.GetNotSupportedException_SerializationNotSupportedCollection(RuntimePropertyType, ParentClassType, PropertyInfo); } EnumerableConverter = s_jsonArrayConverter; } else if (ClassType == ClassType.Dictionary && DefaultImmutableDictionaryConverter.IsImmutableDictionary(RuntimePropertyType)) { DefaultImmutableDictionaryConverter.RegisterImmutableDictionary(RuntimePropertyType, ElementType, Options); DictionaryConverter = s_jsonImmutableDictionaryConverter; } else if (ClassType == ClassType.Enumerable && DefaultImmutableEnumerableConverter.IsImmutableEnumerable(RuntimePropertyType, out bool isImmutableArray)) { DefaultImmutableEnumerableConverter.RegisterImmutableCollection(RuntimePropertyType, ElementType, Options); EnumerableConverter = s_jsonImmutableEnumerableConverter; IsImmutableArray = isImmutableArray; } } } } }
private void DetermineSerializationCapabilities() { if (ClassType != ClassType.Enumerable && ClassType != ClassType.Dictionary && ClassType != ClassType.IDictionaryConstructible) { // We serialize if there is a getter + not ignoring readonly properties. ShouldSerialize = HasGetter && (HasSetter || !Options.IgnoreReadOnlyProperties); // We deserialize if there is a setter. ShouldDeserialize = HasSetter; } else { if (HasGetter) { ShouldSerialize = true; if (HasSetter) { ShouldDeserialize = true; if (RuntimePropertyType.IsArray) { // Verify that we don't have a multidimensional array. if (RuntimePropertyType.GetArrayRank() > 1) { throw ThrowHelper.GetNotSupportedException_SerializationNotSupportedCollection(RuntimePropertyType, ParentClassType, PropertyInfo); } EnumerableConverter = s_jsonArrayConverter; } else if (ClassType == ClassType.IDictionaryConstructible) { // Natively supported type. if (DeclaredPropertyType == ImplementedPropertyType) { if (RuntimePropertyType.FullName.StartsWith(JsonClassInfo.ImmutableNamespaceName)) { DefaultImmutableDictionaryConverter.RegisterImmutableDictionary( RuntimePropertyType, JsonClassInfo.GetElementType(RuntimePropertyType, ParentClassType, PropertyInfo, Options), Options); DictionaryConverter = s_jsonImmutableDictionaryConverter; } else if (JsonClassInfo.IsDeserializedByConstructingWithIDictionary(RuntimePropertyType)) { DictionaryConverter = s_jsonIDictionaryConverter; } } // Type that implements a type with ClassType IDictionaryConstructible. else { DictionaryConverter = s_jsonDerivedDictionaryConverter; } } else if (ClassType == ClassType.Enumerable) { // Else if it's an implementing type whose runtime type is not assignable to IList. if (DeclaredPropertyType != ImplementedPropertyType && (!typeof(IList).IsAssignableFrom(RuntimePropertyType) || ImplementedPropertyType == typeof(ArrayList) || ImplementedPropertyType == typeof(IList))) { EnumerableConverter = s_jsonDerivedEnumerableConverter; } else if (JsonClassInfo.IsDeserializedByConstructingWithIList(RuntimePropertyType) || (!typeof(IList).IsAssignableFrom(RuntimePropertyType) && JsonClassInfo.HasConstructorThatTakesGenericIEnumerable(RuntimePropertyType, Options))) { EnumerableConverter = s_jsonICollectionConverter; } else if (RuntimePropertyType.IsGenericType && RuntimePropertyType.FullName.StartsWith(JsonClassInfo.ImmutableNamespaceName) && RuntimePropertyType.GetGenericArguments().Length == 1) { DefaultImmutableEnumerableConverter.RegisterImmutableCollection(RuntimePropertyType, JsonClassInfo.GetElementType(RuntimePropertyType, ParentClassType, PropertyInfo, Options), Options); EnumerableConverter = s_jsonImmutableEnumerableConverter; } } } } } }