private void AddCollectionItemContractsToKnownDataContracts() { if (_traditionalDataContract.KnownDataContracts != null) { foreach (KeyValuePair <XmlQualifiedName, DataContract> knownDataContract in _traditionalDataContract.KnownDataContracts) { CollectionDataContract?collectionDataContract = knownDataContract.Value as CollectionDataContract; while (collectionDataContract != null) { DataContract itemContract = collectionDataContract.ItemContract; if (_knownDataContracts == null) { _knownDataContracts = new Dictionary <XmlQualifiedName, DataContract>(); } _knownDataContracts.TryAdd(itemContract.StableName, itemContract); if (collectionDataContract.ItemType.IsGenericType && collectionDataContract.ItemType.GetGenericTypeDefinition() == typeof(KeyValue <,>)) { DataContract itemDataContract = DataContract.GetDataContract(Globals.TypeOfKeyValuePair.MakeGenericType(collectionDataContract.ItemType.GenericTypeArguments)); _knownDataContracts.TryAdd(itemDataContract.StableName, itemDataContract); } if (!(itemContract is CollectionDataContract)) { break; } collectionDataContract = itemContract as CollectionDataContract; } } } }
internal static DataContract?ResolveJsonDataContractFromRootDataContract(XmlObjectSerializerContext context, XmlQualifiedName typeQName, DataContract rootTypeDataContract) { if (rootTypeDataContract.StableName == typeQName) { return(rootTypeDataContract); } CollectionDataContract?collectionContract = rootTypeDataContract as CollectionDataContract; while (collectionContract != null) { DataContract itemContract; if (collectionContract.ItemType.IsGenericType && collectionContract.ItemType.GetGenericTypeDefinition() == typeof(KeyValue <,>)) { itemContract = context.GetDataContract(Globals.TypeOfKeyValuePair.MakeGenericType(collectionContract.ItemType.GetGenericArguments())); } else { itemContract = context.GetDataContract(context.GetSurrogatedType(collectionContract.ItemType)); } if (itemContract.StableName == typeQName) { return(itemContract); } collectionContract = itemContract as CollectionDataContract; } return(null); }
protected virtual DataContract?ResolveDataContractFromRootDataContract(XmlQualifiedName typeQName) { CollectionDataContract?collectionContract = rootTypeDataContract as CollectionDataContract; while (collectionContract != null) { DataContract itemContract = GetDataContract(GetSurrogatedType(collectionContract.ItemType)); if (itemContract.XmlName == typeQName) { return(itemContract); } collectionContract = itemContract as CollectionDataContract; } return(null); }
protected DataContract?ResolveDataContractFromKnownTypes(string typeName, string?typeNs, DataContract?memberTypeContract, Type?declaredType) { XmlQualifiedName qname = new XmlQualifiedName(typeName, typeNs); DataContract? dataContract; if (_dataContractResolver == null) { dataContract = ResolveDataContractFromKnownTypes(qname); } else { Type?dataContractType = _dataContractResolver.ResolveName(typeName, typeNs, declaredType, KnownTypeResolver); dataContract = dataContractType == null ? null : GetDataContract(dataContractType); } if (dataContract == null) { if (memberTypeContract != null && !memberTypeContract.UnderlyingType.IsInterface && memberTypeContract.StableName == qname) { dataContract = memberTypeContract; } if (dataContract == null && rootTypeDataContract != null) { if (rootTypeDataContract.StableName == qname) { dataContract = rootTypeDataContract; } else { CollectionDataContract?collectionContract = rootTypeDataContract as CollectionDataContract; while (collectionContract != null) { DataContract itemContract = GetDataContract(GetSurrogatedType(collectionContract.ItemType)); if (itemContract.StableName == qname) { dataContract = itemContract; break; } collectionContract = itemContract as CollectionDataContract; } } } } return(dataContract); }
private object?ReflectionInternalDeserialize(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, CollectionDataContract?collectionContract, Type type, string name, string ns) { return(context.InternalDeserialize(xmlReader, DataContract.GetId(type.TypeHandle), type.TypeHandle, name, ns)); }