| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349 |
- //-----------------------------------------------------------------------------
- // Copyright (c) Microsoft Corporation. All rights reserved.
- //-----------------------------------------------------------------------------
- namespace System.Runtime.Serialization
- {
- using System;
- using System.Collections.Generic;
- using System.Reflection;
- using System.Security;
- class DataMember
- {
- [Fx.Tag.SecurityNote(Critical = "Holds instance of CriticalHelper which keeps state that is cached statically for serialization."
- + " Static fields are marked SecurityCritical or readonly to prevent data from being modified or leaked to other components in appdomain.")]
- [SecurityCritical]
- CriticalHelper helper;
- [Fx.Tag.SecurityNote(Critical = "Initializes SecurityCritical field 'helper'.",
- Safe = "Doesn't leak anything.")]
- [SecuritySafeCritical]
- internal DataMember()
- {
- helper = new CriticalHelper();
- }
- [Fx.Tag.SecurityNote(Critical = "Initializes SecurityCritical field 'helper'.",
- Safe = "Doesn't leak anything.")]
- [SecuritySafeCritical]
- internal DataMember(MemberInfo memberInfo)
- {
- helper = new CriticalHelper(memberInfo);
- }
- [Fx.Tag.SecurityNote(Critical = "Initializes SecurityCritical field 'helper'.",
- Safe = "Doesn't leak anything.")]
- [SecuritySafeCritical]
- internal DataMember(string name)
- {
- helper = new CriticalHelper(name);
- }
- [Fx.Tag.SecurityNote(Critical = "Initializes SecurityCritical field 'helper'.",
- Safe = "Doesn't leak anything.")]
- [SecuritySafeCritical]
- internal DataMember(DataContract memberTypeContract, string name, bool isNullable, bool isRequired, bool emitDefaultValue, int order)
- {
- helper = new CriticalHelper(memberTypeContract, name, isNullable, isRequired, emitDefaultValue, order);
- }
- internal MemberInfo MemberInfo
- {
- [SecuritySafeCritical]
- get { return helper.MemberInfo; }
- }
- internal string Name
- {
- [SecuritySafeCritical]
- get { return helper.Name; }
- [SecurityCritical]
- set { helper.Name = value; }
- }
- internal int Order
- {
- [SecuritySafeCritical]
- get { return helper.Order; }
- [SecurityCritical]
- set { helper.Order = value; }
- }
- internal bool IsRequired
- {
- [SecuritySafeCritical]
- get { return helper.IsRequired; }
- [SecurityCritical]
- set { helper.IsRequired = value; }
- }
- internal bool EmitDefaultValue
- {
- [SecuritySafeCritical]
- get { return helper.EmitDefaultValue; }
- [SecurityCritical]
- set { helper.EmitDefaultValue = value; }
- }
- internal bool IsNullable
- {
- [SecuritySafeCritical]
- get { return helper.IsNullable; }
- [SecurityCritical]
- set { helper.IsNullable = value; }
- }
- internal bool IsGetOnlyCollection
- {
- [SecuritySafeCritical]
- get { return helper.IsGetOnlyCollection; }
- [SecurityCritical]
- set { helper.IsGetOnlyCollection = value; }
- }
- internal Type MemberType
- {
- [SecuritySafeCritical]
- get { return helper.MemberType; }
- }
- internal DataContract MemberTypeContract
- {
- [SecuritySafeCritical]
- get { return helper.MemberTypeContract; }
- [SecurityCritical]
- set { helper.MemberTypeContract = value; }
- }
- internal bool HasConflictingNameAndType
- {
- [SecuritySafeCritical]
- get { return helper.HasConflictingNameAndType; }
- [SecurityCritical]
- set { helper.HasConflictingNameAndType = value; }
- }
- internal DataMember ConflictingMember
- {
- [SecuritySafeCritical]
- get { return helper.ConflictingMember; }
- [SecurityCritical]
- set { helper.ConflictingMember = value; }
- }
- [Fx.Tag.SecurityNote(Critical = "Critical.")]
- #if !NO_SECURITY_ATTRIBUTES
- [SecurityCritical(SecurityCriticalScope.Everything)]
- #endif
- class CriticalHelper
- {
- DataContract memberTypeContract;
- string name;
- int order;
- bool isRequired;
- bool emitDefaultValue;
- bool isNullable;
- bool isGetOnlyCollection = false;
- MemberInfo memberInfo;
- bool hasConflictingNameAndType;
- DataMember conflictingMember;
- internal CriticalHelper()
- {
- this.emitDefaultValue = Globals.DefaultEmitDefaultValue;
- }
- internal CriticalHelper(MemberInfo memberInfo)
- {
- this.emitDefaultValue = Globals.DefaultEmitDefaultValue;
- this.memberInfo = memberInfo;
- }
- internal CriticalHelper(string name)
- {
- this.Name = name;
- }
- internal CriticalHelper(DataContract memberTypeContract, string name, bool isNullable, bool isRequired, bool emitDefaultValue, int order)
- {
- this.MemberTypeContract = memberTypeContract;
- this.Name = name;
- this.IsNullable = isNullable;
- this.IsRequired = isRequired;
- this.EmitDefaultValue = emitDefaultValue;
- this.Order = order;
- }
- internal MemberInfo MemberInfo
- {
- get { return memberInfo; }
- }
- internal string Name
- {
- get { return name; }
- set { name = value; }
- }
- internal int Order
- {
- get { return order; }
- set { order = value; }
- }
- internal bool IsRequired
- {
- get { return isRequired; }
- set { isRequired = value; }
- }
- internal bool EmitDefaultValue
- {
- get { return emitDefaultValue; }
- set { emitDefaultValue = value; }
- }
- internal bool IsNullable
- {
- get { return isNullable; }
- set { isNullable = value; }
- }
- internal bool IsGetOnlyCollection
- {
- get { return isGetOnlyCollection; }
- set { isGetOnlyCollection = value; }
- }
- internal Type MemberType
- {
- get
- {
- FieldInfo field = MemberInfo as FieldInfo;
- if (field != null)
- return field.FieldType;
- return ((PropertyInfo)MemberInfo).PropertyType;
- }
- }
- internal DataContract MemberTypeContract
- {
- get
- {
- if (memberTypeContract == null)
- {
- if (MemberInfo != null)
- {
- if (this.IsGetOnlyCollection)
- {
- memberTypeContract = DataContract.GetGetOnlyCollectionDataContract(DataContract.GetId(MemberType.TypeHandle), MemberType.TypeHandle, MemberType, SerializationMode.SharedContract);
- }
- else
- {
- memberTypeContract = DataContract.GetDataContract(MemberType);
- }
- }
- }
- return memberTypeContract;
- }
- set
- {
- memberTypeContract = value;
- }
- }
- internal bool HasConflictingNameAndType
- {
- get { return this.hasConflictingNameAndType; }
- set { this.hasConflictingNameAndType = value; }
- }
- internal DataMember ConflictingMember
- {
- get { return this.conflictingMember; }
- set { this.conflictingMember = value; }
- }
- }
- #if !NO_DYNAMIC_CODEGEN
- [Fx.Tag.SecurityNote(Miscellaneous = "RequiresReview - checks member visibility to calculate if access to it requires MemberAccessPermission for serialization."
- + " Since this information is used to determine whether to give the generated code access"
- + " permissions to private members, any changes to the logic should be reviewed.")]
- internal bool RequiresMemberAccessForGet()
- {
- MemberInfo memberInfo = MemberInfo;
- FieldInfo field = memberInfo as FieldInfo;
- if (field != null)
- {
- return DataContract.FieldRequiresMemberAccess(field);
- }
- else
- {
- PropertyInfo property = (PropertyInfo)memberInfo;
- MethodInfo getMethod = property.GetGetMethod(true /*nonPublic*/);
- if (getMethod != null)
- return DataContract.MethodRequiresMemberAccess(getMethod) || !DataContract.IsTypeVisible(property.PropertyType);
- }
- return false;
- }
- [Fx.Tag.SecurityNote(Miscellaneous = "RequiresReview - checks member visibility to calculate if access to it requires MemberAccessPermission for deserialization."
- + " Since this information is used to determine whether to give the generated code access"
- + " permissions to private members, any changes to the logic should be reviewed.")]
- internal bool RequiresMemberAccessForSet()
- {
- MemberInfo memberInfo = MemberInfo;
- FieldInfo field = memberInfo as FieldInfo;
- if (field != null)
- {
- return DataContract.FieldRequiresMemberAccess(field);
- }
- else
- {
- PropertyInfo property = (PropertyInfo)memberInfo;
- MethodInfo setMethod = property.GetSetMethod(true /*nonPublic*/);
- if (setMethod != null)
- return DataContract.MethodRequiresMemberAccess(setMethod) || !DataContract.IsTypeVisible(property.PropertyType);
- }
- return false;
- }
- #endif
- internal DataMember BindGenericParameters(DataContract[] paramContracts, Dictionary<DataContract, DataContract> boundContracts)
- {
- DataContract memberTypeContract = this.MemberTypeContract.BindGenericParameters(paramContracts, boundContracts);
- DataMember boundDataMember = new DataMember(memberTypeContract,
- this.Name,
- !memberTypeContract.IsValueType,
- this.IsRequired,
- this.EmitDefaultValue,
- this.Order);
- return boundDataMember;
- }
- internal bool Equals(object other, Dictionary<DataContractPairKey, object> checkedContracts)
- {
- if ((object)this == other)
- return true;
- DataMember dataMember = other as DataMember;
- if (dataMember != null)
- {
- // Note: comparison does not use Order hint since it influences element order but does not specify exact order
- bool thisIsNullable = (MemberTypeContract == null) ? false : !MemberTypeContract.IsValueType;
- bool dataMemberIsNullable = (dataMember.MemberTypeContract == null) ? false : !dataMember.MemberTypeContract.IsValueType;
- return (Name == dataMember.Name
- && (IsNullable || thisIsNullable) == (dataMember.IsNullable || dataMemberIsNullable)
- && IsRequired == dataMember.IsRequired
- && EmitDefaultValue == dataMember.EmitDefaultValue
- && MemberTypeContract.Equals(dataMember.MemberTypeContract, checkedContracts));
- }
- return false;
- }
- public override int GetHashCode()
- {
- return base.GetHashCode();
- }
- }
- }
|