コード例 #1
0
            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;
                        }
                    }
                }
            }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
 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));
 }