diff options
Diffstat (limited to 'src/mscorlib/src/System/Runtime/Serialization/FormatterServices.cs')
-rw-r--r-- | src/mscorlib/src/System/Runtime/Serialization/FormatterServices.cs | 480 |
1 files changed, 0 insertions, 480 deletions
diff --git a/src/mscorlib/src/System/Runtime/Serialization/FormatterServices.cs b/src/mscorlib/src/System/Runtime/Serialization/FormatterServices.cs index 27c3f15136..c3f9eb4452 100644 --- a/src/mscorlib/src/System/Runtime/Serialization/FormatterServices.cs +++ b/src/mscorlib/src/System/Runtime/Serialization/FormatterServices.cs @@ -18,10 +18,6 @@ namespace System.Runtime.Serialization { using System.Collections; using System.Collections.Generic; using System.Security; - using System.Security.Permissions; -#if FEATURE_SERIALIZATION - using System.Runtime.Serialization.Formatters; -#endif using System.Runtime.Remoting; using System.Runtime.CompilerServices; using System.Runtime.Versioning; @@ -32,211 +28,7 @@ namespace System.Runtime.Serialization { using System.Diagnostics; using System.Diagnostics.Contracts; - [System.Runtime.InteropServices.ComVisible(true)] public static class FormatterServices { -#if FEATURE_SERIALIZATION - internal static Dictionary<MemberHolder, MemberInfo[]> m_MemberInfoTable = new Dictionary<MemberHolder, MemberInfo[]>(32); - private static bool unsafeTypeForwardersIsEnabled = false; - - private static volatile bool unsafeTypeForwardersIsEnabledInitialized = false; - - private static Object s_FormatterServicesSyncObject = null; - - private static Object formatterServicesSyncObject - { - get - { - if (s_FormatterServicesSyncObject == null) - { - Object o = new Object(); - Interlocked.CompareExchange<Object>(ref s_FormatterServicesSyncObject, o, null); - } - return s_FormatterServicesSyncObject; - } - } - - static FormatterServices() - { - // Static initialization touches security critical types, so we need an - // explicit static constructor to allow us to mark it safe critical. - } - - private static MemberInfo[] GetSerializableMembers(RuntimeType type) { - // get the list of all fields - FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); - int countProper = 0; - for (int i = 0; i < fields.Length; i++) { - if ((fields[i].Attributes & FieldAttributes.NotSerialized) == FieldAttributes.NotSerialized) - continue; - countProper++; - } - if (countProper != fields.Length) { - FieldInfo[] properFields = new FieldInfo[countProper]; - countProper = 0; - for (int i = 0; i < fields.Length; i++) { - if ((fields[i].Attributes & FieldAttributes.NotSerialized) == FieldAttributes.NotSerialized) - continue; - properFields[countProper] = fields[i]; - countProper++; - } - return properFields; - } - else - return fields; - } - - private static bool CheckSerializable(RuntimeType type) { - if (type.IsSerializable) { - return true; - } - return false; - } - - private static MemberInfo[] InternalGetSerializableMembers(RuntimeType type) { - List<SerializationFieldInfo> allMembers = null; - MemberInfo[] typeMembers; - FieldInfo [] typeFields; - RuntimeType parentType; - - Debug.Assert((object)type != null, "[GetAllSerializableMembers]type!=null"); - - if (type.IsInterface) { - return new MemberInfo[0]; - } - - if (!(CheckSerializable(type))) { - throw new SerializationException(Environment.GetResourceString("Serialization_NonSerType", type.FullName, type.Module.Assembly.FullName)); - } - - //Get all of the serializable members in the class to be serialized. - typeMembers = GetSerializableMembers(type); - - //If this class doesn't extend directly from object, walk its hierarchy and - //get all of the private and assembly-access fields (e.g. all fields that aren't - //virtual) and include them in the list of things to be serialized. - parentType = (RuntimeType)(type.BaseType); - if (parentType != null && parentType != (RuntimeType)typeof(Object)) { - RuntimeType[] parentTypes = null; - int parentTypeCount = 0; - bool classNamesUnique = GetParentTypes(parentType, out parentTypes, out parentTypeCount); - if (parentTypeCount > 0){ - allMembers = new List<SerializationFieldInfo>(); - for (int i = 0; i < parentTypeCount;i++){ - parentType = parentTypes[i]; - if (!CheckSerializable(parentType)) { - throw new SerializationException(Environment.GetResourceString("Serialization_NonSerType", parentType.FullName, parentType.Module.Assembly.FullName)); - } - - typeFields = parentType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance); - String typeName = classNamesUnique ? parentType.Name : parentType.FullName; - foreach (FieldInfo field in typeFields) { - // Family and Assembly fields will be gathered by the type itself. - if (!field.IsNotSerialized) { - allMembers.Add(new SerializationFieldInfo((RuntimeFieldInfo)field, typeName)); - } - } - } - //If we actually found any new MemberInfo's, we need to create a new MemberInfo array and - //copy all of the members which we've found so far into that. - if (allMembers!=null && allMembers.Count>0) { - MemberInfo[] membersTemp = new MemberInfo[allMembers.Count + typeMembers.Length]; - Array.Copy(typeMembers, membersTemp, typeMembers.Length); - ((ICollection)allMembers).CopyTo(membersTemp, typeMembers.Length); - typeMembers = membersTemp; - } - } - } - return typeMembers; - } - - private static bool GetParentTypes(RuntimeType parentType, out RuntimeType[] parentTypes, out int parentTypeCount){ - //Check if there are any dup class names. Then we need to include as part of - //typeName to prefix the Field names in SerializationFieldInfo - /*out*/ parentTypes = null; - /*out*/ parentTypeCount = 0; - bool unique = true; - RuntimeType objectType = (RuntimeType)typeof(object); - for (RuntimeType t1 = parentType; t1 != objectType; t1 = (RuntimeType)t1.BaseType) - { - if (t1.IsInterface) continue; - string t1Name = t1.Name; - for(int i=0;unique && i<parentTypeCount;i++){ - string t2Name = parentTypes[i].Name; - if (t2Name.Length == t1Name.Length && t2Name[0] == t1Name[0] && t1Name == t2Name){ - unique = false; - break; - } - } - //expand array if needed - if (parentTypes == null || parentTypeCount == parentTypes.Length){ - RuntimeType[] tempParentTypes = new RuntimeType[Math.Max(parentTypeCount*2, 12)]; - if (parentTypes != null) - Array.Copy(parentTypes, 0, tempParentTypes, 0, parentTypeCount); - parentTypes = tempParentTypes; - } - parentTypes[parentTypeCount++] = t1; - } - return unique; - } - - // Get all of the Serializable members for a particular class. For all practical intents and - // purposes, this is the non-transient, non-static members (fields and properties). In order to - // be included, properties must have both a getter and a setter. N.B.: A class - // which implements ISerializable or has a serialization surrogate may not use all of these members - // (or may have additional members). - public static MemberInfo[] GetSerializableMembers(Type type) { - return GetSerializableMembers(type, new StreamingContext(StreamingContextStates.All)); - } - - // Get all of the Serializable Members for a particular class. If we're not cloning, this is all - // non-transient, non-static fields. If we are cloning, include the transient fields as well since - // we know that we're going to live inside of the same context. - public static MemberInfo[] GetSerializableMembers(Type type, StreamingContext context) { - MemberInfo[] members; - - if ((object)type==null) { - throw new ArgumentNullException(nameof(type)); - } - Contract.EndContractBlock(); - - if (!(type is RuntimeType)) { - throw new SerializationException(Environment.GetResourceString("Serialization_InvalidType", type.ToString())); - } - - MemberHolder mh = new MemberHolder(type, context); - - //If we've already gathered the members for this type, just return them. - if (m_MemberInfoTable.ContainsKey(mh)) { - return m_MemberInfoTable[mh]; - } - - lock (formatterServicesSyncObject) { - //If we've already gathered the members for this type, just return them. - if (m_MemberInfoTable.ContainsKey(mh)) { - return m_MemberInfoTable[mh]; - } - - members = InternalGetSerializableMembers((RuntimeType)type); - - m_MemberInfoTable[mh] = members; - } - - return members; - } - - static readonly Type[] advancedTypes = new Type[]{ - typeof(System.DelegateSerializationHolder), - }; - - public static void CheckTypeSecurity(Type t, TypeFilterLevel securityLevel) { - if (securityLevel == TypeFilterLevel.Low){ - for(int i=0;i<advancedTypes.Length;i++){ - if (advancedTypes[i].IsAssignableFrom(t)) - throw new SecurityException(Environment.GetResourceString("Serialization_TypeSecurity", advancedTypes[i].FullName, t.FullName)); - } - } - } -#endif // FEATURE_SERIALIZATION // Gets a new instance of the object. The entire object is initalized to 0 and no // constructors have been run. **THIS MEANS THAT THE OBJECT MAY NOT BE IN A STATE @@ -258,188 +50,9 @@ namespace System.Runtime.Serialization { return nativeGetUninitializedObject((RuntimeType)type); } - public static Object GetSafeUninitializedObject(Type type) { - if ((object)type == null) { - throw new ArgumentNullException(nameof(type)); - } - Contract.EndContractBlock(); - - if (!(type is RuntimeType)) { - throw new SerializationException(Environment.GetResourceString("Serialization_InvalidType", type.ToString())); - } - - try { - return nativeGetSafeUninitializedObject((RuntimeType)type); - } - catch(SecurityException e) { - throw new SerializationException(Environment.GetResourceString("Serialization_Security", type.FullName), e); - } - } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - private static extern Object nativeGetSafeUninitializedObject(RuntimeType type); - [MethodImplAttribute(MethodImplOptions.InternalCall)] private static extern Object nativeGetUninitializedObject(RuntimeType type); -#if FEATURE_SERIALIZATION - [MethodImplAttribute(MethodImplOptions.InternalCall)] - private static extern bool GetEnableUnsafeTypeForwarders(); - - internal static bool UnsafeTypeForwardersIsEnabled() - { - if (!unsafeTypeForwardersIsEnabledInitialized) - { - unsafeTypeForwardersIsEnabled = GetEnableUnsafeTypeForwarders(); - unsafeTypeForwardersIsEnabledInitialized = true; - } - - return unsafeTypeForwardersIsEnabled; - } -#endif private static Binder s_binder = Type.DefaultBinder; - internal static void SerializationSetValue(MemberInfo fi, Object target, Object value) - { - Contract.Requires(fi != null); - - RtFieldInfo rtField = fi as RtFieldInfo; - - if (rtField != null) - { - rtField.CheckConsistency(target); - rtField.UnsafeSetValue(target, value, BindingFlags.Default, s_binder, null); - return; - } - - SerializationFieldInfo serField = fi as SerializationFieldInfo; - if (serField != null) - { - serField.InternalSetValue(target, value, BindingFlags.Default, s_binder, null); - return; - } - - throw new ArgumentException(Environment.GetResourceString("Argument_InvalidFieldInfo")); - } - - // Fill in the members of obj with the data contained in data. - // Returns the number of members populated. - // - public static Object PopulateObjectMembers(Object obj, MemberInfo[] members, Object[] data) { - if (obj==null) { - throw new ArgumentNullException(nameof(obj)); - } - - if (members==null) { - throw new ArgumentNullException(nameof(members)); - } - - if (data==null) { - throw new ArgumentNullException(nameof(data)); - } - - if (members.Length!=data.Length) { - throw new ArgumentException(Environment.GetResourceString("Argument_DataLengthDifferent")); - } - Contract.EndContractBlock(); - - MemberInfo mi; - - BCLDebug.Trace("SER", "[PopulateObjectMembers]Enter."); - - for (int i=0; i<members.Length; i++) { - mi = members[i]; - - if (mi==null) { - throw new ArgumentNullException(nameof(members), Environment.GetResourceString("ArgumentNull_NullMember", i)); - } - - //If we find an empty, it means that the value was never set during deserialization. - //This is either a forward reference or a null. In either case, this may break some of the - //invariants mantained by the setter, so we'll do nothing with it for right now. - if (data[i]!=null) { - if (mi.MemberType==MemberTypes.Field) { - SerializationSetValue(mi, obj, data[i]); - } else { - throw new SerializationException(Environment.GetResourceString("Serialization_UnknownMemberInfo")); - } - - BCLDebug.Trace("SER", "[PopulateObjectMembers]\tType:", obj.GetType(), "\tMember:", - members[i].Name, " with member type: ", ((FieldInfo)members[i]).FieldType); - } - //Console.WriteLine("X"); - } - - BCLDebug.Trace("SER", "[PopulateObjectMembers]Leave."); - - return obj; - } - - // Extracts the data from obj. members is the array of members which we wish to - // extract (must be FieldInfos or PropertyInfos). For each supplied member, extract the matching value and - // return it in a Object[] of the same size. - // - public static Object[] GetObjectData(Object obj, MemberInfo[] members) { - - if (obj==null) { - throw new ArgumentNullException(nameof(obj)); - } - - if (members==null) { - throw new ArgumentNullException(nameof(members)); - } - Contract.EndContractBlock(); - - int numberOfMembers = members.Length; - - Object[] data = new Object[numberOfMembers]; - MemberInfo mi; - - for (int i=0; i<numberOfMembers; i++) { - mi=members[i]; - - if (mi==null) { - throw new ArgumentNullException(nameof(members), Environment.GetResourceString("ArgumentNull_NullMember", i)); - } - - if (mi.MemberType==MemberTypes.Field) { - Debug.Assert(mi is RuntimeFieldInfo || mi is SerializationFieldInfo, - "[FormatterServices.GetObjectData]mi is RuntimeFieldInfo || mi is SerializationFieldInfo."); - - RtFieldInfo rfi = mi as RtFieldInfo; - if (rfi != null) { - rfi.CheckConsistency(obj); - data[i] = rfi.UnsafeGetValue(obj); - } else { - data[i] = ((SerializationFieldInfo)mi).InternalGetValue(obj); - } - } else { - throw new SerializationException(Environment.GetResourceString("Serialization_UnknownMemberInfo")); - } - } - - return data; - } - - [System.Runtime.InteropServices.ComVisible(false)] - public static ISerializationSurrogate GetSurrogateForCyclicalReference(ISerializationSurrogate innerSurrogate) - { - if (innerSurrogate == null) - throw new ArgumentNullException(nameof(innerSurrogate)); - Contract.EndContractBlock(); - return new SurrogateForCyclicalReference(innerSurrogate); - } - - /*=============================GetTypeFromAssembly============================== - **Action: - **Returns: - **Arguments: - **Exceptions: - ==============================================================================*/ - public static Type GetTypeFromAssembly(Assembly assem, String name) { - if (assem==null) - throw new ArgumentNullException(nameof(assem)); - Contract.EndContractBlock(); - return assem.GetType(name, false, false); - } /*============================LoadAssemblyFromString============================ **Action: Loads an assembly from a given string. The current assembly loading story @@ -460,99 +73,6 @@ namespace System.Runtime.Serialization { Assembly found = Assembly.Load(assemblyName); return found; } - - internal static Assembly LoadAssemblyFromStringNoThrow(String assemblyName) { - try { - return LoadAssemblyFromString(assemblyName); - } - catch (Exception e){ - BCLDebug.Trace("SER", "[LoadAssemblyFromString]", e.ToString()); - } - return null; - } - - internal static string GetClrAssemblyName(Type type, out bool hasTypeForwardedFrom) { - if ((object)type == null) { - throw new ArgumentNullException(nameof(type)); - } - - object[] typeAttributes = type.GetCustomAttributes(typeof(TypeForwardedFromAttribute), false); - if (typeAttributes != null && typeAttributes.Length > 0) { - hasTypeForwardedFrom = true; - TypeForwardedFromAttribute typeForwardedFromAttribute = (TypeForwardedFromAttribute)typeAttributes[0]; - return typeForwardedFromAttribute.AssemblyFullName; - } - else { - hasTypeForwardedFrom = false; - return type.Assembly.FullName; - } - } - - internal static string GetClrTypeFullName(Type type) { - if (type.IsArray) { - return GetClrTypeFullNameForArray(type); - } - else { - return GetClrTypeFullNameForNonArrayTypes(type); - } - } - - static string GetClrTypeFullNameForArray(Type type) { - int rank = type.GetArrayRank(); - if (rank == 1) - { - return String.Format(CultureInfo.InvariantCulture, "{0}{1}", GetClrTypeFullName(type.GetElementType()), "[]"); - } - else - { - StringBuilder builder = new StringBuilder(GetClrTypeFullName(type.GetElementType())).Append("["); - for (int commaIndex = 1; commaIndex < rank; commaIndex++) - { - builder.Append(","); - } - builder.Append("]"); - return builder.ToString(); - } - } - - static string GetClrTypeFullNameForNonArrayTypes(Type type) { - if (!type.IsGenericType) { - return type.FullName; - } - - Type[] genericArguments = type.GetGenericArguments(); - StringBuilder builder = new StringBuilder(type.GetGenericTypeDefinition().FullName).Append("["); - bool hasTypeForwardedFrom; - - foreach (Type genericArgument in genericArguments) { - builder.Append("[").Append(GetClrTypeFullName(genericArgument)).Append(", "); - builder.Append(GetClrAssemblyName(genericArgument, out hasTypeForwardedFrom)).Append("],"); - } - - //remove the last comma and close typename for generic with a close bracket - return builder.Remove(builder.Length - 1, 1).Append("]").ToString(); - } - } - - internal sealed class SurrogateForCyclicalReference : ISerializationSurrogate - { - ISerializationSurrogate innerSurrogate; - internal SurrogateForCyclicalReference(ISerializationSurrogate innerSurrogate) - { - if (innerSurrogate == null) - throw new ArgumentNullException(nameof(innerSurrogate)); - this.innerSurrogate = innerSurrogate; - } - - public void GetObjectData(Object obj, SerializationInfo info, StreamingContext context) - { - innerSurrogate.GetObjectData(obj, info, context); - } - - public Object SetObjectData(Object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector) - { - return innerSurrogate.SetObjectData(obj, info, context, selector); - } } } |