| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373 |
- //------------------------------------------------------------
- // Copyright (c) Microsoft Corporation. All rights reserved.
- //------------------------------------------------------------
- namespace System.Runtime.Serialization
- {
- using System;
- using System.Collections.Generic;
- using System.Reflection;
- using System.Runtime.Serialization.Diagnostics.Application;
- using System.Security;
- using System.Xml;
- using DataContractDictionary = System.Collections.Generic.Dictionary<System.Xml.XmlQualifiedName, DataContract>;
- #if USE_REFEMIT
- public class XmlObjectSerializerContext
- #else
- internal class XmlObjectSerializerContext
- #endif
- {
- protected XmlObjectSerializer serializer;
- protected DataContract rootTypeDataContract;
- internal ScopedKnownTypes scopedKnownTypes = new ScopedKnownTypes();
- protected DataContractDictionary serializerKnownDataContracts;
- bool isSerializerKnownDataContractsSetExplicit;
- protected IList<Type> serializerKnownTypeList;
- [Fx.Tag.SecurityNote(Critical = "We base the decision whether to Demand SerializationFormatterPermission on this value.")]
- [SecurityCritical]
- bool demandedSerializationFormatterPermission;
- [Fx.Tag.SecurityNote(Critical = "We base the decision whether to Demand MemberAccess on this value.")]
- [SecurityCritical]
- bool demandedMemberAccessPermission;
- int itemCount;
- int maxItemsInObjectGraph;
- StreamingContext streamingContext;
- bool ignoreExtensionDataObject;
- DataContractResolver dataContractResolver;
- KnownTypeDataContractResolver knownTypeResolver;
- internal XmlObjectSerializerContext(XmlObjectSerializer serializer, int maxItemsInObjectGraph, StreamingContext streamingContext, bool ignoreExtensionDataObject, DataContractResolver dataContractResolver)
- {
- this.serializer = serializer;
- this.itemCount = 1;
- this.maxItemsInObjectGraph = maxItemsInObjectGraph;
- this.streamingContext = streamingContext;
- this.ignoreExtensionDataObject = ignoreExtensionDataObject;
- this.dataContractResolver = dataContractResolver;
- }
- internal XmlObjectSerializerContext(XmlObjectSerializer serializer, int maxItemsInObjectGraph, StreamingContext streamingContext, bool ignoreExtensionDataObject)
- : this(serializer, maxItemsInObjectGraph, streamingContext, ignoreExtensionDataObject, null)
- {
- }
- internal XmlObjectSerializerContext(DataContractSerializer serializer, DataContract rootTypeDataContract, DataContractResolver dataContractResolver)
- : this(serializer,
- serializer.MaxItemsInObjectGraph,
- new StreamingContext(StreamingContextStates.All),
- serializer.IgnoreExtensionDataObject,
- dataContractResolver)
- {
- this.rootTypeDataContract = rootTypeDataContract;
- this.serializerKnownTypeList = serializer.knownTypeList;
- }
- internal XmlObjectSerializerContext(NetDataContractSerializer serializer)
- : this(serializer,
- serializer.MaxItemsInObjectGraph,
- serializer.Context,
- serializer.IgnoreExtensionDataObject)
- {
- }
- internal virtual SerializationMode Mode
- {
- get { return SerializationMode.SharedContract; }
- }
- internal virtual bool IsGetOnlyCollection
- {
- get { return false; }
- set { }
- }
- [Fx.Tag.SecurityNote(Critical = "Demands SerializationFormatter permission. demanding the right permission is critical.",
- Safe = "No data or control leaks in or out, must be callable from transparent generated IL.")]
- [SecuritySafeCritical]
- public void DemandSerializationFormatterPermission()
- {
- #if FEATURE_MONO_CAS
- if (!demandedSerializationFormatterPermission)
- {
- Globals.SerializationFormatterPermission.Demand();
- demandedSerializationFormatterPermission = true;
- }
- #endif
- }
- [Fx.Tag.SecurityNote(Critical = "Demands MemberAccess permission. demanding the right permission is critical.",
- Safe = "No data or control leaks in or out, must be callable from transparent generated IL.")]
- [SecuritySafeCritical]
- public void DemandMemberAccessPermission()
- {
- #if FEATURE_MONO_CAS
- if (!demandedMemberAccessPermission)
- {
- Globals.MemberAccessPermission.Demand();
- demandedMemberAccessPermission = true;
- }
- #endif
- }
- public StreamingContext GetStreamingContext()
- {
- return streamingContext;
- }
- static MethodInfo incrementItemCountMethod;
- internal static MethodInfo IncrementItemCountMethod
- {
- get
- {
- if (incrementItemCountMethod == null)
- incrementItemCountMethod = typeof(XmlObjectSerializerContext).GetMethod("IncrementItemCount", Globals.ScanAllMembers);
- return incrementItemCountMethod;
- }
- }
- public void IncrementItemCount(int count)
- {
- if (count > maxItemsInObjectGraph - itemCount)
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.ExceededMaxItemsQuota, maxItemsInObjectGraph)));
- itemCount += count;
- }
- internal int RemainingItemCount
- {
- get { return maxItemsInObjectGraph - itemCount; }
- }
- internal bool IgnoreExtensionDataObject
- {
- get { return ignoreExtensionDataObject; }
- }
- protected DataContractResolver DataContractResolver
- {
- get { return dataContractResolver; }
- }
- protected KnownTypeDataContractResolver KnownTypeResolver
- {
- get
- {
- if (knownTypeResolver == null)
- {
- knownTypeResolver = new KnownTypeDataContractResolver(this);
- }
- return knownTypeResolver;
- }
- }
- internal DataContract GetDataContract(Type type)
- {
- return GetDataContract(type.TypeHandle, type);
- }
- internal virtual DataContract GetDataContract(RuntimeTypeHandle typeHandle, Type type)
- {
- if (IsGetOnlyCollection)
- {
- return DataContract.GetGetOnlyCollectionDataContract(DataContract.GetId(typeHandle), typeHandle, type, Mode);
- }
- else
- {
- return DataContract.GetDataContract(typeHandle, type, Mode);
- }
- }
- internal virtual DataContract GetDataContractSkipValidation(int typeId, RuntimeTypeHandle typeHandle, Type type)
- {
- if (IsGetOnlyCollection)
- {
- return DataContract.GetGetOnlyCollectionDataContractSkipValidation(typeId, typeHandle, type);
- }
- else
- {
- return DataContract.GetDataContractSkipValidation(typeId, typeHandle, type);
- }
- }
- internal virtual DataContract GetDataContract(int id, RuntimeTypeHandle typeHandle)
- {
- if (IsGetOnlyCollection)
- {
- return DataContract.GetGetOnlyCollectionDataContract(id, typeHandle, null /*type*/, Mode);
- }
- else
- {
- return DataContract.GetDataContract(id, typeHandle, Mode);
- }
- }
- internal virtual void CheckIfTypeSerializable(Type memberType, bool isMemberTypeSerializable)
- {
- if (!isMemberTypeSerializable)
- throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.TypeNotSerializable, memberType)));
- }
- internal virtual Type GetSurrogatedType(Type type)
- {
- return type;
- }
- DataContractDictionary SerializerKnownDataContracts
- {
- get
- {
- // This field must be initialized during construction by serializers using data contracts.
- if (!this.isSerializerKnownDataContractsSetExplicit)
- {
- this.serializerKnownDataContracts = serializer.KnownDataContracts;
- this.isSerializerKnownDataContractsSetExplicit = true;
- }
- return this.serializerKnownDataContracts;
- }
- }
- DataContract GetDataContractFromSerializerKnownTypes(XmlQualifiedName qname)
- {
- DataContractDictionary serializerKnownDataContracts = this.SerializerKnownDataContracts;
- if (serializerKnownDataContracts == null)
- return null;
- DataContract outDataContract;
- return serializerKnownDataContracts.TryGetValue(qname, out outDataContract) ? outDataContract : null;
- }
- internal static DataContractDictionary GetDataContractsForKnownTypes(IList<Type> knownTypeList)
- {
- if (knownTypeList == null) return null;
- DataContractDictionary dataContracts = new DataContractDictionary();
- Dictionary<Type, Type> typesChecked = new Dictionary<Type, Type>();
- for (int i = 0; i < knownTypeList.Count; i++)
- {
- Type knownType = knownTypeList[i];
- if (knownType == null)
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.NullKnownType, "knownTypes")));
- DataContract.CheckAndAdd(knownType, typesChecked, ref dataContracts);
- }
- return dataContracts;
- }
- internal bool IsKnownType(DataContract dataContract, DataContractDictionary knownDataContracts, Type declaredType)
- {
- bool knownTypesAddedInCurrentScope = false;
- if (knownDataContracts != null)
- {
- scopedKnownTypes.Push(knownDataContracts);
- knownTypesAddedInCurrentScope = true;
- }
- bool isKnownType = IsKnownType(dataContract, declaredType);
- if (knownTypesAddedInCurrentScope)
- {
- scopedKnownTypes.Pop();
- }
- return isKnownType;
- }
- internal bool IsKnownType(DataContract dataContract, Type declaredType)
- {
- DataContract knownContract = ResolveDataContractFromKnownTypes(dataContract.StableName.Name, dataContract.StableName.Namespace, null /*memberTypeContract*/, declaredType);
- return knownContract != null && knownContract.UnderlyingType == dataContract.UnderlyingType;
- }
- DataContract ResolveDataContractFromKnownTypes(XmlQualifiedName typeName)
- {
- DataContract dataContract = PrimitiveDataContract.GetPrimitiveDataContract(typeName.Name, typeName.Namespace);
- if (dataContract == null)
- {
- dataContract = scopedKnownTypes.GetDataContract(typeName);
- if (dataContract == null)
- {
- dataContract = GetDataContractFromSerializerKnownTypes(typeName);
- }
- }
- return dataContract;
- }
- DataContract ResolveDataContractFromDataContractResolver(XmlQualifiedName typeName, Type declaredType)
- {
- if (TD.DCResolverResolveIsEnabled())
- {
- TD.DCResolverResolve(typeName.Name + ":" + typeName.Namespace);
- }
- Type dataContractType = DataContractResolver.ResolveName(typeName.Name, typeName.Namespace, declaredType, KnownTypeResolver);
- if (dataContractType == null)
- {
- return null;
- }
- else
- {
- return GetDataContract(dataContractType);
- }
- }
- internal Type ResolveNameFromKnownTypes(XmlQualifiedName typeName)
- {
- DataContract dataContract = ResolveDataContractFromKnownTypes(typeName);
- if (dataContract == null)
- {
- return null;
- }
- else
- {
- return dataContract.OriginalUnderlyingType;
- }
- }
- 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
- {
- dataContract = ResolveDataContractFromDataContractResolver(qname, declaredType);
- }
- if (dataContract == null)
- {
- if (memberTypeContract != null
- && !memberTypeContract.UnderlyingType.IsInterface
- && memberTypeContract.StableName == qname)
- {
- dataContract = memberTypeContract;
- }
- if (dataContract == null && rootTypeDataContract != null)
- {
- dataContract = ResolveDataContractFromRootDataContract(qname);
- }
- }
- return dataContract;
- }
- protected virtual DataContract ResolveDataContractFromRootDataContract(XmlQualifiedName typeQName)
- {
- if (rootTypeDataContract.StableName == typeQName)
- return rootTypeDataContract;
- CollectionDataContract collectionContract = rootTypeDataContract as CollectionDataContract;
- while (collectionContract != null)
- {
- DataContract itemContract = GetDataContract(GetSurrogatedType(collectionContract.ItemType));
- if (itemContract.StableName == typeQName)
- {
- return itemContract;
- }
- collectionContract = itemContract as CollectionDataContract;
- }
- return null;
- }
- }
- }
|