diff --git a/src/libraries/System.Private.DataContractSerialization/src/ILLink/ILLink.Suppressions.xml b/src/libraries/System.Private.DataContractSerialization/src/ILLink/ILLink.Suppressions.xml deleted file mode 100644 index 7e36a2f01ffabd..00000000000000 --- a/src/libraries/System.Private.DataContractSerialization/src/ILLink/ILLink.Suppressions.xml +++ /dev/null @@ -1,389 +0,0 @@ - - - - - ILLink - IL2026 - member - M:System.Runtime.Serialization.XmlDataContract.GenerateCreateXmlSerializableDelegate - - - ILLink - IL2026 - member - M:System.Runtime.Serialization.XsdDataContractExporter.CanExport(System.Collections.Generic.ICollection{System.Reflection.Assembly}) - - - ILLink - IL2026 - member - M:System.Runtime.Serialization.XsdDataContractExporter.Export(System.Collections.Generic.ICollection{System.Reflection.Assembly}) - - - ILLink - IL2046 - member - M:System.Runtime.Serialization.Json.DataContractJsonSerializerImpl.InternalReadObject(System.Runtime.Serialization.XmlReaderDelegator,System.Boolean) - - - ILLink - IL2046 - member - M:System.Runtime.Serialization.Json.DataContractJsonSerializerImpl.InternalWriteObject(System.Runtime.Serialization.XmlWriterDelegator,System.Object) - - - ILLink - IL2046 - member - M:System.Runtime.Serialization.Json.DataContractJsonSerializerImpl.InternalWriteObjectContent(System.Runtime.Serialization.XmlWriterDelegator,System.Object) - - - ILLink - IL2046 - member - M:System.Runtime.Serialization.Json.ReflectionJsonReader.ReflectionReadDictionaryItem(System.Runtime.Serialization.XmlReaderDelegator,System.Runtime.Serialization.XmlObjectSerializerReadContext,System.Runtime.Serialization.CollectionDataContract) - - - ILLink - IL2046 - member - M:System.Runtime.Serialization.Json.XmlObjectSerializerReadContextComplexJson.ReadDataContractValue(System.Runtime.Serialization.DataContract,System.Runtime.Serialization.XmlReaderDelegator) - - - ILLink - IL2046 - member - M:System.Runtime.Serialization.Json.XmlObjectSerializerWriteContextComplexJson.WriteDataContractValue(System.Runtime.Serialization.DataContract,System.Runtime.Serialization.XmlWriterDelegator,System.Object,System.RuntimeTypeHandle) - - - ILLink - IL2055 - member - M:System.Runtime.Serialization.ClassDataContract.ClassDataContractCriticalHelper.SetKeyValuePairAdapterFlags(System.Type) - - - ILLink - IL2055 - member - M:System.Runtime.Serialization.CollectionDataContract.CollectionDataContractCriticalHelper.GetCollectionElementType - - - ILLink - IL2055 - member - M:System.Runtime.Serialization.CollectionDataContract.CollectionDataContractCriticalHelper.IncrementCollectionCount(System.Runtime.Serialization.XmlWriterDelegator,System.Object,System.Runtime.Serialization.XmlObjectSerializerWriteContext) - - - ILLink - IL2055 - member - M:System.Runtime.Serialization.CollectionDataContract.IsCollectionOrTryCreate(System.Type,System.Boolean,System.Runtime.Serialization.DataContract@,System.Type@,System.Boolean) - - - ILLink - IL2055 - member - M:System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractAdapterType(System.Type) - - - ILLink - IL2055 - member - M:System.Runtime.Serialization.DataContract.ImportKnownTypeAttributes(System.Type,System.Collections.Generic.Dictionary{System.Type,System.Type},System.Collections.Generic.Dictionary{System.Xml.XmlQualifiedName,System.Runtime.Serialization.DataContract}@) - - - ILLink - IL2055 - member - M:System.Runtime.Serialization.Globals.get_TypeOfHashtable - - - ILLink - IL2055 - member - M:System.Runtime.Serialization.ReflectionReader.ReflectionCreateCollection(System.Runtime.Serialization.CollectionDataContract) - - - ILLink - IL2055 - member - M:System.Runtime.Serialization.XmlFormatReaderGenerator.CriticalHelper.GenerateClassReader(System.Runtime.Serialization.ClassDataContract) - - - ILLink - IL2055 - member - M:System.Runtime.Serialization.XmlFormatReaderGenerator.CriticalHelper.ReadCollection(System.Runtime.Serialization.CollectionDataContract) - - - ILLink - IL2055 - member - M:System.Runtime.Serialization.XmlFormatReaderGenerator.CriticalHelper.WrapNullableObject(System.Reflection.Emit.LocalBuilder,System.Reflection.Emit.LocalBuilder,System.Int32) - - - ILLink - IL2055 - member - M:System.Runtime.Serialization.XmlFormatWriterGenerator.CriticalHelper.InitArgs(System.Type) - - - ILLink - IL2055 - member - M:System.Runtime.Serialization.XmlFormatWriterGenerator.CriticalHelper.WriteCollection(System.Runtime.Serialization.CollectionDataContract) - - - ILLink - IL2060 - member - M:System.Runtime.Serialization.CollectionDataContract.CollectionDataContractCriticalHelper.GetEnumeratorForCollection(System.Object) - - - ILLink - IL2060 - member - M:System.Runtime.Serialization.CollectionDataContract.CollectionDataContractCriticalHelper.IncrementCollectionCount(System.Runtime.Serialization.XmlWriterDelegator,System.Object,System.Runtime.Serialization.XmlObjectSerializerWriteContext) - - - ILLink - IL2060 - member - M:System.Runtime.Serialization.FastInvokerBuilder.CreateGetter(System.Reflection.MemberInfo) - - - ILLink - IL2060 - member - M:System.Runtime.Serialization.FastInvokerBuilder.CreateSetter(System.Reflection.MemberInfo) - - - ILLink - IL2060 - member - M:System.Runtime.Serialization.FastInvokerBuilder.GetMakeNewInstanceFunc(System.Type) - - - ILLink - IL2060 - member - M:System.Runtime.Serialization.ReflectionReader.GetCollectionSetItemDelegate``1(System.Runtime.Serialization.CollectionDataContract,System.Object,System.Boolean) - - - ILLink - IL2060 - member - M:System.Runtime.Serialization.ReflectionReader.ReadCollectionItems(System.Runtime.Serialization.XmlReaderDelegator,System.Runtime.Serialization.XmlObjectSerializerReadContext,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.Runtime.Serialization.CollectionDataContract,System.Object,System.Boolean) - - - ILLink - IL2060 - member - M:System.Runtime.Serialization.XmlFormatGeneratorStatics.GetDefaultValue(System.Type) - - - ILLink - IL2060 - member - M:System.Runtime.Serialization.XmlFormatReaderGenerator.CriticalHelper.ReadCollection(System.Runtime.Serialization.CollectionDataContract) - - - ILLink - IL2060 - member - M:System.Runtime.Serialization.XmlFormatWriterGenerator.CriticalHelper.UnwrapNullableObject(System.Reflection.Emit.LocalBuilder) - - - ILLink - IL2060 - member - M:System.Runtime.Serialization.XmlFormatWriterGenerator.CriticalHelper.WriteCollection(System.Runtime.Serialization.CollectionDataContract) - - - ILLink - IL2067 - member - M:System.Runtime.Serialization.SchemaExporter.InvokeGetSchemaMethod(System.Type,System.Xml.Schema.XmlSchemaSet,System.Xml.XmlQualifiedName) - - - ILLink - IL2067 - member - M:System.Runtime.Serialization.XmlFormatReaderGenerator.UnsafeGetUninitializedObject(System.Type) - - - ILLink - IL2070 - member - M:System.Runtime.Serialization.ClassDataContract.ClassDataContractCriticalHelper.SetKeyValuePairAdapterFlags(System.Type) - - - ILLink - IL2070 - member - M:System.Runtime.Serialization.ClassDataContract.IsNonAttributedTypeValidForSerialization(System.Type) - - - ILLink - IL2070 - member - M:System.Runtime.Serialization.CodeGenerator.BeginMethod(System.String,System.Type,System.Boolean) - - - ILLink - IL2070 - member - M:System.Runtime.Serialization.CollectionDataContract.GetCollectionMethods(System.Type,System.Type,System.Type[],System.Boolean,System.Reflection.MethodInfo@,System.Reflection.MethodInfo@) - - - ILLink - IL2070 - member - M:System.Runtime.Serialization.CollectionDataContract.IsCollectionOrTryCreate(System.Type,System.Boolean,System.Runtime.Serialization.DataContract@,System.Type@,System.Boolean) - - - ILLink - IL2070 - member - M:System.Runtime.Serialization.DataContract.ImportKnownTypeAttributes(System.Type,System.Collections.Generic.Dictionary{System.Type,System.Type},System.Collections.Generic.Dictionary{System.Xml.XmlQualifiedName,System.Runtime.Serialization.DataContract}@) - - - ILLink - IL2070 - member - M:System.Runtime.Serialization.ReflectionClassWriter.ReflectionWriteValue(System.Runtime.Serialization.XmlWriterDelegator,System.Runtime.Serialization.XmlObjectSerializerWriteContext,System.Type,System.Object,System.Boolean,System.Runtime.Serialization.PrimitiveDataContract) - - - ILLink - IL2070 - member - M:System.Runtime.Serialization.SchemaExporter.InvokeSchemaProviderMethod(System.Type,System.Xml.Schema.XmlSchemaSet,System.Xml.XmlQualifiedName@,System.Xml.Schema.XmlSchemaType@,System.Boolean@) - - - ILLink - IL2072 - member - M:System.Runtime.Serialization.ReflectionReader.ReflectionCreateCollection(System.Runtime.Serialization.CollectionDataContract) - - - ILLink - IL2075 - member - M:System.Runtime.Serialization.ClassDataContract.ClassDataContractCriticalHelper.EnsureMethodsImported - - - ILLink - IL2075 - member - M:System.Runtime.Serialization.ClassDataContract.ClassDataContractCriticalHelper.GetISerializableConstructor - - - ILLink - IL2075 - member - M:System.Runtime.Serialization.ClassDataContract.ClassDataContractCriticalHelper.GetNonAttributedTypeConstructor - - - ILLink - IL2075 - member - M:System.Runtime.Serialization.ClassDataContract.ClassDataContractCriticalHelper.ImportDataMembers - - - ILLink - IL2075 - member - M:System.Runtime.Serialization.CollectionDataContract.CollectionDataContractCriticalHelper.GetCollectionElementType - - - ILLink - IL2075 - member - M:System.Runtime.Serialization.CollectionDataContract.FindCollectionMethodsOnInterface(System.Type,System.Type,System.Reflection.MethodInfo@,System.Reflection.MethodInfo@) - - - ILLink - IL2075 - member - M:System.Runtime.Serialization.CollectionDataContract.GetTargetMethodWithName(System.String,System.Type,System.Type) - - - ILLink - IL2075 - member - M:System.Runtime.Serialization.CollectionDataContract.IsCollectionOrTryCreate(System.Type,System.Boolean,System.Runtime.Serialization.DataContract@,System.Type@,System.Boolean) - - - ILLink - IL2075 - member - M:System.Runtime.Serialization.DataContract.DataContractCriticalHelper.get_ParseMethod - - - ILLink - IL2075 - member - M:System.Runtime.Serialization.EnumDataContract.EnumDataContractCriticalHelper.ImportDataMembers - - - ILLink - IL2075 - member - M:System.Runtime.Serialization.ReflectionClassWriter.ReflectionWriteValue(System.Runtime.Serialization.XmlWriterDelegator,System.Runtime.Serialization.XmlObjectSerializerWriteContext,System.Type,System.Object,System.Boolean,System.Runtime.Serialization.PrimitiveDataContract) - - - ILLink - IL2075 - member - M:System.Runtime.Serialization.ReflectionReader.ReflectionCreateCollection(System.Runtime.Serialization.CollectionDataContract) - - - ILLink - IL2075 - member - M:System.Runtime.Serialization.XmlDataContract.GenerateCreateXmlSerializableDelegate - - - ILLink - IL2075 - member - M:System.Runtime.Serialization.XmlDataContract.GetConstructor - - - ILLink - IL2075 - member - M:System.Runtime.Serialization.XmlFormatGeneratorStatics.get_GetArrayLengthMethod - - - ILLink - IL2075 - member - M:System.Runtime.Serialization.XmlFormatGeneratorStatics.get_HashtableCtor - - - ILLink - IL2075 - member - M:System.Runtime.Serialization.XmlFormatReaderGenerator.CriticalHelper.CreateObject(System.Runtime.Serialization.ClassDataContract) - - - ILLink - IL2075 - member - M:System.Runtime.Serialization.XmlFormatReaderGenerator.CriticalHelper.ReadCollection(System.Runtime.Serialization.CollectionDataContract) - - - ILLink - IL2075 - member - M:System.Runtime.Serialization.XmlFormatReaderGenerator.CriticalHelper.WrapNullableObject(System.Reflection.Emit.LocalBuilder,System.Reflection.Emit.LocalBuilder,System.Int32) - - - ILLink - IL2075 - member - M:System.Runtime.Serialization.XmlFormatWriterGenerator.CriticalHelper.WriteCollection(System.Runtime.Serialization.CollectionDataContract) - - - diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/AccessorBuilder.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/AccessorBuilder.cs index 8052ffd0fd7c97..6dbb9d6196b8bf 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/AccessorBuilder.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/AccessorBuilder.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Reflection; using System.Runtime.Serialization; @@ -23,12 +24,18 @@ internal static class FastInvokerBuilder private static readonly MethodInfo s_createSetterInternal = typeof(FastInvokerBuilder).GetMethod(nameof(CreateSetterInternal), BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static)!; private static readonly MethodInfo s_make = typeof(FastInvokerBuilder).GetMethod(nameof(Make), BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static)!; - public static Func GetMakeNewInstanceFunc(Type type) + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2060:MakeGenericMethod", + Justification = "The call to MakeGenericMethod is safe due to the fact that we are preserving the constructors of type which is what Make() is doing.")] + public static Func GetMakeNewInstanceFunc( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] + Type type) { Func make = s_make.MakeGenericMethod(type).CreateDelegate>(); return make; } + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2060:MakeGenericMethod", + Justification = "The call to MakeGenericMethod is safe due to the fact that FastInvokerBuilder.CreateGetterInternal is not annotated.")] public static Getter CreateGetter(MemberInfo memberInfo) { if (memberInfo is PropertyInfo propInfo) @@ -51,6 +58,8 @@ public static Getter CreateGetter(MemberInfo memberInfo) } } + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2060:MakeGenericMethod", + Justification = "The call to MakeGenericMethod is safe due to the fact that FastInvokerBuilder.CreateSetterInternal is not annotated.")] public static Setter CreateSetter(MemberInfo memberInfo) { if (memberInfo is PropertyInfo) diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ClassDataContract.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ClassDataContract.cs index b1230c1e978080..410ca8825098ee 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ClassDataContract.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ClassDataContract.cs @@ -33,11 +33,21 @@ internal sealed class ClassDataContract : DataContract private bool _isScriptObject; + internal const DynamicallyAccessedMemberTypes DataContractPreserveMemberTypes = + DynamicallyAccessedMemberTypes.PublicMethods | + DynamicallyAccessedMemberTypes.NonPublicMethods | + DynamicallyAccessedMemberTypes.PublicConstructors | + DynamicallyAccessedMemberTypes.NonPublicConstructors | + DynamicallyAccessedMemberTypes.PublicFields | + DynamicallyAccessedMemberTypes.PublicProperties; + + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal ClassDataContract(Type type) : base(new ClassDataContractCriticalHelper(type)) { InitClassDataContract(); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private ClassDataContract(Type type, XmlDictionaryString ns, string[] memberNames) : base(new ClassDataContractCriticalHelper(type, ns, memberNames)) { InitClassDataContract(); @@ -65,6 +75,7 @@ internal List? Members public XmlDictionaryString?[]? ChildElementNamespaces { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (_childElementNamespaces == null) @@ -122,6 +133,7 @@ internal MethodInfo? ExtensionDataSetMethod public override DataContractDictionary? KnownDataContracts { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { return _helper.KnownDataContracts; } } @@ -228,6 +240,7 @@ internal bool CreateNewInstanceViaDefaultConstructor([NotNullWhen(true)] out obj return true; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private XmlFormatClassWriterDelegate CreateXmlFormatWriterDelegate() { return new XmlFormatWriterGenerator().GenerateClassWriter(this); @@ -235,6 +248,7 @@ private XmlFormatClassWriterDelegate CreateXmlFormatWriterDelegate() internal XmlFormatClassWriterDelegate XmlFormatWriterDelegate { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (_helper.XmlFormatWriterDelegate == null) @@ -256,6 +270,7 @@ internal XmlFormatClassWriterDelegate XmlFormatWriterDelegate } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private XmlFormatClassReaderDelegate CreateXmlFormatReaderDelegate() { return new XmlFormatReaderGenerator().GenerateClassReader(this); @@ -263,6 +278,7 @@ private XmlFormatClassReaderDelegate CreateXmlFormatReaderDelegate() internal XmlFormatClassReaderDelegate XmlFormatReaderDelegate { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (_helper.XmlFormatReaderDelegate == null) @@ -284,6 +300,7 @@ internal XmlFormatClassReaderDelegate XmlFormatReaderDelegate } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static ClassDataContract CreateClassDataContractForKeyValue(Type type, XmlDictionaryString ns, string[] memberNames) { ClassDataContract? cdc = (ClassDataContract?)DataContract.GetDataContractFromGeneratedAssembly(type); @@ -317,6 +334,7 @@ internal static void CheckAndAddMember(List members, DataMember memb members.Add(memberContract); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static XmlDictionaryString? GetChildNamespaceToDeclare(DataContract dataContract, Type childType, XmlDictionary dictionary) { childType = DataContract.UnwrapNullableType(childType); @@ -342,7 +360,9 @@ private static bool IsArraySegment(Type t) /// is therefore marked SRR /// Safe - does not let caller influence isNonAttributedType calculation; no harm in leaking value /// - internal static bool IsNonAttributedTypeValidForSerialization(Type type) + internal static bool IsNonAttributedTypeValidForSerialization( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] + Type type) { if (type.IsArray) return false; @@ -437,6 +457,7 @@ internal static bool IsNonSerializedMember(Type type, string memberName) && members.Contains(memberName); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private XmlDictionaryString?[]? CreateChildElementNamespaces() { if (Members == null) @@ -464,6 +485,7 @@ private void EnsureMethodsImported() _helper.EnsureMethodsImported(); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator xmlWriter, object obj, XmlObjectSerializerWriteContext? context) { Debug.Assert(context != null); @@ -475,6 +497,7 @@ public override void WriteXmlValue(XmlWriterDelegator xmlWriter, object obj, Xml XmlFormatWriterDelegate(xmlWriter, obj, context, this); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext? context) { if (_isScriptObject) @@ -711,7 +734,9 @@ private sealed class ClassDataContractCriticalHelper : DataContract.DataContract public XmlDictionaryString[]? MemberNames; public XmlDictionaryString[]? MemberNamespaces; - internal ClassDataContractCriticalHelper(Type type) : base(type) + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] + internal ClassDataContractCriticalHelper([DynamicallyAccessedMembers(DataContractPreserveMemberTypes)] + Type type) : base(type) { XmlQualifiedName stableName = GetStableNameAndSetHasDataContract(type); if (type == Globals.TypeOfDBNull) @@ -823,7 +848,10 @@ internal ClassDataContractCriticalHelper(Type type) : base(type) Globals.TypeOfScriptObject_IsAssignableFrom(this.UnderlyingType); } - internal ClassDataContractCriticalHelper(Type type, XmlDictionaryString ns, string[] memberNames) : base(type) + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] + internal ClassDataContractCriticalHelper( + [DynamicallyAccessedMembers(DataContractPreserveMemberTypes)] + Type type, XmlDictionaryString ns, string[] memberNames) : base(type) { this.StableName = new XmlQualifiedName(GetStableNameAndSetHasDataContract(type).Name, ns.Value); ImportDataMembers(); @@ -896,6 +924,7 @@ private void EnsureIsReferenceImported(Type type) [MemberNotNull(nameof(_members))] [MemberNotNull(nameof(Members))] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void ImportDataMembers() { Type type = this.UnderlyingType; @@ -1075,6 +1104,7 @@ private static bool CanSerializeMember(FieldInfo? field) return field != null && !ClassDataContract.IsNonSerializedMember(field.DeclaringType!, field.Name); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private bool SetIfGetOnlyCollection(DataMember memberContract) { //OK to call IsCollection here since the use of surrogated collection types is not supported in get-only scenarios @@ -1148,6 +1178,7 @@ private void SetIfMembersHaveConflict(List members) } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private XmlQualifiedName GetStableNameAndSetHasDataContract(Type type) { return DataContract.GetStableName(type, out _hasDataContract); @@ -1160,7 +1191,9 @@ private XmlQualifiedName GetStableNameAndSetHasDataContract(Type type) /// is dependent on the correct calculation of hasDataContract /// Safe - does not let caller influence isNonAttributedType calculation; no harm in leaking value /// - private void SetIsNonAttributedType(Type type) + private void SetIsNonAttributedType( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] + Type type) { _isNonAttributedType = !type.IsSerializable && !_hasDataContract && IsNonAttributedTypeValidForSerialization(type); } @@ -1314,6 +1347,8 @@ internal MethodInfo? ExtensionDataSetMethod internal override DataContractDictionary? KnownDataContracts { + + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (_knownDataContracts != null) @@ -1362,7 +1397,10 @@ internal bool IsNonAttributedType get { return _isNonAttributedType; } } - private void SetKeyValuePairAdapterFlags(Type type) + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] + private void SetKeyValuePairAdapterFlags( + [DynamicallyAccessedMembers(DataContractPreserveMemberTypes)] + Type type) { if (type.IsGenericType && type.GetGenericTypeDefinition() == Globals.TypeOfKeyValuePairAdapter) { @@ -1491,6 +1529,7 @@ public int Compare(Member x, Member y) internal static DataMemberConflictComparer Singleton = new DataMemberConflictComparer(); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal ClassDataContractCriticalHelper Clone() { ClassDataContractCriticalHelper clonedHelper = new ClassDataContractCriticalHelper(this.UnderlyingType); @@ -1552,6 +1591,7 @@ internal Type ObjectType } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal ClassDataContract Clone() { ClassDataContract clonedDc = new ClassDataContract(this.UnderlyingType); @@ -1565,6 +1605,7 @@ internal ClassDataContract Clone() return clonedDc; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal void UpdateNamespaceAndMembers(Type type, XmlDictionaryString ns, string[] memberNames) { this.StableName = new XmlQualifiedName(GetStableName(type).Name, ns.Value); diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/CollectionDataContract.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/CollectionDataContract.cs index 0c25be7988c52f..f5ecf0a48e1cb4 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/CollectionDataContract.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/CollectionDataContract.cs @@ -134,29 +134,34 @@ internal sealed class CollectionDataContract : DataContract private CollectionDataContractCriticalHelper _helper; + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal CollectionDataContract(Type type) : base(new CollectionDataContractCriticalHelper(type)) { InitCollectionDataContract(this); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private CollectionDataContract(Type type, CollectionKind kind, Type itemType, MethodInfo getEnumeratorMethod, string? deserializationExceptionMessage) : base(new CollectionDataContractCriticalHelper(type, kind, itemType, getEnumeratorMethod, deserializationExceptionMessage)) { InitCollectionDataContract(GetSharedTypeContract(type)); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private CollectionDataContract(Type type, CollectionKind kind, Type itemType, MethodInfo getEnumeratorMethod, MethodInfo? addMethod, ConstructorInfo? constructor) : base(new CollectionDataContractCriticalHelper(type, kind, itemType, getEnumeratorMethod, addMethod, constructor)) { InitCollectionDataContract(GetSharedTypeContract(type)); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private CollectionDataContract(Type type, CollectionKind kind, Type itemType, MethodInfo getEnumeratorMethod, MethodInfo? addMethod, ConstructorInfo? constructor, bool isConstructorCheckRequired) : base(new CollectionDataContractCriticalHelper(type, kind, itemType, getEnumeratorMethod, addMethod, constructor, isConstructorCheckRequired)) { InitCollectionDataContract(GetSharedTypeContract(type)); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private CollectionDataContract(Type type, string invalidCollectionInSharedContractMessage) : base(new CollectionDataContractCriticalHelper(type, invalidCollectionInSharedContractMessage)) { InitCollectionDataContract(GetSharedTypeContract(type)); @@ -164,6 +169,7 @@ private CollectionDataContract(Type type, string invalidCollectionInSharedContra [MemberNotNull(nameof(_helper))] [MemberNotNull(nameof(_collectionItemName))] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void InitCollectionDataContract(DataContract? sharedTypeContract) { _helper = (base.Helper as CollectionDataContractCriticalHelper)!; @@ -196,6 +202,7 @@ public Type ItemType public DataContract ItemContract { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { return _itemContract ?? _helper.ItemContract; @@ -254,6 +261,7 @@ internal bool IsDictionary public XmlDictionaryString? ChildElementNamespace { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (_childElementNamespace == null) @@ -311,6 +319,7 @@ internal ConstructorInfo? Constructor public override DataContractDictionary? KnownDataContracts { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { return _helper.KnownDataContracts; } @@ -334,6 +343,7 @@ internal bool IsReadOnlyContract get { return DeserializationExceptionMessage != null; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private XmlFormatCollectionWriterDelegate CreateXmlFormatWriterDelegate() { return new XmlFormatWriterGenerator().GenerateCollectionWriter(this); @@ -341,6 +351,7 @@ private XmlFormatCollectionWriterDelegate CreateXmlFormatWriterDelegate() internal XmlFormatCollectionWriterDelegate XmlFormatWriterDelegate { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (_helper.XmlFormatWriterDelegate == null) @@ -362,6 +373,7 @@ internal XmlFormatCollectionWriterDelegate XmlFormatWriterDelegate } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private XmlFormatCollectionReaderDelegate CreateXmlFormatReaderDelegate() { return new XmlFormatReaderGenerator().GenerateCollectionReader(this); @@ -369,6 +381,7 @@ private XmlFormatCollectionReaderDelegate CreateXmlFormatReaderDelegate() internal XmlFormatCollectionReaderDelegate XmlFormatReaderDelegate { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (_helper.XmlFormatReaderDelegate == null) @@ -395,6 +408,7 @@ internal XmlFormatCollectionReaderDelegate XmlFormatReaderDelegate } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private XmlFormatGetOnlyCollectionReaderDelegate CreateXmlFormatGetOnlyCollectionReaderDelegate() { return new XmlFormatReaderGenerator().GenerateGetOnlyCollectionReader(this); @@ -403,6 +417,7 @@ private XmlFormatGetOnlyCollectionReaderDelegate CreateXmlFormatGetOnlyCollectio internal XmlFormatGetOnlyCollectionReaderDelegate XmlFormatGetOnlyCollectionReaderDelegate { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (_helper.XmlFormatGetOnlyCollectionReaderDelegate == null) @@ -449,6 +464,7 @@ internal IEnumerator GetEnumeratorForCollection(object obj) return _helper.GetEnumeratorForCollection(obj); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal Type GetCollectionElementType() { return _helper.GetCollectionElementType(); @@ -504,6 +520,7 @@ internal static Type[] KnownInterfaces } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void Init(CollectionKind kind, Type? itemType, CollectionDataContractAttribute? collectionContractAttribute) { _kind = kind; @@ -559,7 +576,10 @@ private void Init(CollectionKind kind, Type? itemType, CollectionDataContractAtt } // array - internal CollectionDataContractCriticalHelper(Type type) : base(type) + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] + internal CollectionDataContractCriticalHelper( + [DynamicallyAccessedMembers(ClassDataContract.DataContractPreserveMemberTypes)] + Type type) : base(type) { if (type == Globals.TypeOfArray) type = Globals.TypeOfObjectArray; @@ -570,7 +590,11 @@ internal CollectionDataContractCriticalHelper(Type type) : base(type) } // read-only collection - internal CollectionDataContractCriticalHelper(Type type, CollectionKind kind, Type itemType, MethodInfo getEnumeratorMethod, string? deserializationExceptionMessage) + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] + internal CollectionDataContractCriticalHelper( + [DynamicallyAccessedMembers(ClassDataContract.DataContractPreserveMemberTypes)] + Type type, + CollectionKind kind, Type itemType, MethodInfo getEnumeratorMethod, string? deserializationExceptionMessage) : base(type) { if (getEnumeratorMethod == null) @@ -587,7 +611,11 @@ internal CollectionDataContractCriticalHelper(Type type, CollectionKind kind, Ty } // collection - internal CollectionDataContractCriticalHelper(Type type, CollectionKind kind, Type itemType, MethodInfo getEnumeratorMethod, MethodInfo? addMethod, ConstructorInfo? constructor) : base(type) + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] + internal CollectionDataContractCriticalHelper( + [DynamicallyAccessedMembers(ClassDataContract.DataContractPreserveMemberTypes)] + Type type, + CollectionKind kind, Type itemType, MethodInfo getEnumeratorMethod, MethodInfo? addMethod, ConstructorInfo? constructor) : base(type) { if (getEnumeratorMethod == null) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.Format(SR.CollectionMustHaveGetEnumeratorMethod, DataContract.GetClrTypeFullName(type)))); @@ -606,13 +634,18 @@ internal CollectionDataContractCriticalHelper(Type type, CollectionKind kind, Ty } // collection + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal CollectionDataContractCriticalHelper(Type type, CollectionKind kind, Type itemType, MethodInfo getEnumeratorMethod, MethodInfo? addMethod, ConstructorInfo? constructor, bool isConstructorCheckRequired) : this(type, kind, itemType, getEnumeratorMethod, addMethod, constructor) { _isConstructorCheckRequired = isConstructorCheckRequired; } - internal CollectionDataContractCriticalHelper(Type type, string invalidCollectionInSharedContractMessage) : base(type) + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] + internal CollectionDataContractCriticalHelper( + [DynamicallyAccessedMembers(ClassDataContract.DataContractPreserveMemberTypes)] + Type type, + string invalidCollectionInSharedContractMessage) : base(type) { Init(CollectionKind.Collection, null /*itemType*/, null); _invalidCollectionInSharedContractMessage = invalidCollectionInSharedContractMessage; @@ -631,6 +664,7 @@ internal Type ItemType internal DataContract ItemContract { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (_itemContract == null) @@ -725,6 +759,7 @@ internal bool IsItemTypeNullable internal override DataContractDictionary? KnownDataContracts { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (!_isKnownTypeAttributeChecked && UnderlyingType != null) @@ -793,13 +828,13 @@ internal void IncrementCollectionCount(XmlWriterDelegator xmlWriter, object obj, case CollectionKind.GenericCollection: case CollectionKind.GenericList: { - var buildIncrementCollectionCountDelegate = BuildIncrementCollectionCountDelegateMethod.MakeGenericMethod(ItemType); + var buildIncrementCollectionCountDelegate = GetBuildIncrementCollectionCountGenericDelegate(ItemType); _incrementCollectionCountDelegate = (IncrementCollectionCountDelegate)buildIncrementCollectionCountDelegate.Invoke(null, Array.Empty())!; } break; case CollectionKind.GenericDictionary: { - var buildIncrementCollectionCountDelegate = BuildIncrementCollectionCountDelegateMethod.MakeGenericMethod(Globals.TypeOfKeyValuePair.MakeGenericType(ItemType.GetGenericArguments())); + var buildIncrementCollectionCountDelegate = GetBuildIncrementCollectionCountGenericDelegate(typeof(KeyValuePair<,>).MakeGenericType(ItemType.GetGenericArguments())); _incrementCollectionCountDelegate = (IncrementCollectionCountDelegate)buildIncrementCollectionCountDelegate.Invoke(null, Array.Empty())!; } break; @@ -811,8 +846,16 @@ internal void IncrementCollectionCount(XmlWriterDelegator xmlWriter, object obj, } _incrementCollectionCountDelegate(xmlWriter, obj, context); + + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2060:MakeGenericMethod", + Justification = "The call to MakeGenericMethod is safe due to the fact that CollectionDataContractCriticalHelper.BuildIncrementCollectionCountDelegate is not annotated.")] + static MethodInfo GetBuildIncrementCollectionCountGenericDelegate(Type type) => BuildIncrementCollectionCountDelegateMethod.MakeGenericMethod(type); } + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2060:MakeGenericMethod", + Justification = "The call to MakeGenericMethod is safe due to the fact that CollectionDataContractCriticalHelper.BuildIncrementCollectionCountDelegate is not annotated.")] + private MethodInfo GetBuildIncrementCollectionCountGenericDelegate(Type type) => BuildIncrementCollectionCountDelegateMethod.MakeGenericMethod(type); + private static MethodInfo? s_buildIncrementCollectionCountDelegateMethod; private static MethodInfo BuildIncrementCollectionCountDelegateMethod @@ -849,7 +892,7 @@ internal IEnumerator GetEnumeratorForCollection(object obj) if (_createGenericDictionaryEnumeratorDelegate == null) { var keyValueTypes = ItemType.GetGenericArguments(); - MethodInfo buildCreateGenericDictionaryEnumerator = BuildCreateGenericDictionaryEnumerato.MakeGenericMethod(keyValueTypes[0], keyValueTypes[1]); + MethodInfo buildCreateGenericDictionaryEnumerator = GetBuildCreateGenericDictionaryEnumeratorGenericMethod(keyValueTypes); _createGenericDictionaryEnumeratorDelegate = (CreateGenericDictionaryEnumeratorDelegate)buildCreateGenericDictionaryEnumerator.Invoke(null, Array.Empty())!; } @@ -861,8 +904,13 @@ internal IEnumerator GetEnumeratorForCollection(object obj) } return enumerator; + + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2060:MakeGenericMethod", + Justification = "The call to MakeGenericMethod is safe due to the fact that CollectionDataContractCriticalHelper.BuildCreateGenericDictionaryEnumerator is not annotated.")] + static MethodInfo GetBuildCreateGenericDictionaryEnumeratorGenericMethod(Type[] keyValueTypes) => GetBuildCreateGenericDictionaryEnumeratorMethodInfo.MakeGenericMethod(keyValueTypes[0], keyValueTypes[1]); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal Type GetCollectionElementType() { Debug.Assert(Kind != CollectionKind.Array, "GetCollectionElementType should not be called on Arrays"); @@ -918,7 +966,7 @@ internal Type GetCollectionElementType() private static MethodInfo? s_buildCreateGenericDictionaryEnumerator; - private static MethodInfo BuildCreateGenericDictionaryEnumerato + private static MethodInfo GetBuildCreateGenericDictionaryEnumeratorMethodInfo { get { @@ -940,6 +988,7 @@ private static CreateGenericDictionaryEnumeratorDelegate BuildCreateGenericDicti } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private DataContract? GetSharedTypeContract(Type type) { if (type.IsDefined(Globals.TypeOfCollectionDataContractAttribute, false)) @@ -960,23 +1009,27 @@ internal static bool IsCollectionInterface(Type type) return ((IList)KnownInterfaces).Contains(type); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static bool IsCollection(Type type) { Type? itemType; return IsCollection(type, out itemType); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static bool IsCollection(Type type, [NotNullWhen(true)] out Type? itemType) { return IsCollectionHelper(type, out itemType, true /*constructorRequired*/); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static bool IsCollection(Type type, bool constructorRequired) { Type? itemType; return IsCollectionHelper(type, out itemType, constructorRequired); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private static bool IsCollectionHelper(Type type, [NotNullWhen(true)] out Type? itemType, bool constructorRequired) { if (type.IsArray && DataContract.GetBuiltInDataContract(type) == null) @@ -988,12 +1041,14 @@ private static bool IsCollectionHelper(Type type, [NotNullWhen(true)] out Type? return IsCollectionOrTryCreate(type, false /*tryCreate*/, out dataContract, out itemType, constructorRequired); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static bool TryCreate(Type type, [NotNullWhen(true)] out DataContract? dataContract) { Type itemType; return IsCollectionOrTryCreate(type, true /*tryCreate*/, out dataContract!, out itemType, true /*constructorRequired*/); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static bool CreateGetOnlyCollectionDataContract(Type type, [NotNullWhen(true)] out DataContract? dataContract) { Type itemType; @@ -1008,6 +1063,7 @@ internal static bool CreateGetOnlyCollectionDataContract(Type type, [NotNullWhen } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static bool TryCreateGetOnlyCollectionDataContract(Type type, [NotNullWhen(true)] out DataContract? dataContract) { dataContract = DataContract.GetDataContractFromGeneratedAssembly(type); @@ -1038,7 +1094,14 @@ internal static bool TryCreateGetOnlyCollectionDataContract(Type type, [NotNullW } } - internal static MethodInfo? GetTargetMethodWithName(string name, Type type, Type interfaceType) + // Once https://github.com/mono/linker/issues/1731 is fixed we can remove the suppression from here as it won't be needed any longer. + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2075:GetMethod", + Justification = "The DynamicallyAccessedMembers declarations will ensure the interface methods will be preserved.")] + internal static MethodInfo? GetTargetMethodWithName(string name, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] + Type type, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] + Type interfaceType) { Type? t = type.GetInterfaces().Where(it => it.Equals(interfaceType)).FirstOrDefault(); return t?.GetMethod(name); @@ -1049,6 +1112,7 @@ private static bool IsArraySegment(Type t) return t.IsGenericType && (t.GetGenericTypeDefinition() == typeof(ArraySegment<>)); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private static bool IsCollectionOrTryCreate(Type type, bool tryCreate, out DataContract? dataContract, out Type itemType, bool constructorRequired) { dataContract = null; @@ -1286,6 +1350,7 @@ internal static bool IsCollectionDataContract(Type type) return type.IsDefined(Globals.TypeOfCollectionDataContractAttribute, false); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private static bool HandleIfInvalidCollection(Type type, bool tryCreate, bool hasCollectionDataContract, bool createContractWithException, string message, string? param, ref DataContract? dataContract) { if (hasCollectionDataContract) @@ -1315,7 +1380,15 @@ private static string GetInvalidCollectionMessage(string message, string nestedM return (param == null) ? SR.Format(message, nestedMessage) : SR.Format(message, nestedMessage, param); } - private static void FindCollectionMethodsOnInterface(Type type, Type interfaceType, ref MethodInfo? addMethod, ref MethodInfo? getEnumeratorMethod) + // Once https://github.com/mono/linker/issues/1731 is fixed we can remove the suppression from here as it won't be needed any longer. + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2075:GetMethod", + Justification = "The DynamicallyAccessedMembers declarations will ensure the interface methods will be preserved.")] + private static void FindCollectionMethodsOnInterface( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] + Type type, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] + Type interfaceType, + ref MethodInfo? addMethod, ref MethodInfo? getEnumeratorMethod) { Type? t = type.GetInterfaces().Where(it => it.Equals(interfaceType)).FirstOrDefault(); if (t != null) @@ -1325,7 +1398,13 @@ private static void FindCollectionMethodsOnInterface(Type type, Type interfaceTy } } - private static void GetCollectionMethods(Type type, Type interfaceType, Type[] addMethodTypeArray, bool addMethodOnInterface, out MethodInfo? getEnumeratorMethod, out MethodInfo? addMethod) + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] + private static void GetCollectionMethods( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] + Type type, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] + Type interfaceType, + Type[] addMethodTypeArray, bool addMethodOnInterface, out MethodInfo? getEnumeratorMethod, out MethodInfo? addMethod) { addMethod = getEnumeratorMethod = null; @@ -1370,11 +1449,18 @@ private static void GetCollectionMethods(Type type, Type interfaceType, Type[] a Type? ienumerableInterface = interfaceType.GetInterfaces().Where(t => t.FullName!.StartsWith("System.Collections.Generic.IEnumerable")).FirstOrDefault(); if (ienumerableInterface == null) ienumerableInterface = Globals.TypeOfIEnumerable; - getEnumeratorMethod = GetTargetMethodWithName(Globals.GetEnumeratorMethodName, type, ienumerableInterface); + getEnumeratorMethod = GetIEnumerableGetEnumeratorMethod(type, ienumerableInterface); } } } + private static MethodInfo? GetIEnumerableGetEnumeratorMethod( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] + Type type, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] + Type ienumerableInterface) + => GetTargetMethodWithName(Globals.GetEnumeratorMethodName, type, ienumerableInterface); + private static bool IsKnownInterface(Type type) { Type typeToCheck = type.IsGenericType ? type.GetGenericTypeDefinition() : type; @@ -1517,6 +1603,7 @@ internal bool RequiresMemberAccessForWrite(SecurityException? securityException) return false; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator xmlWriter, object obj, XmlObjectSerializerWriteContext? context) { Debug.Assert(context != null); @@ -1526,6 +1613,7 @@ public override void WriteXmlValue(XmlWriterDelegator xmlWriter, object obj, Xml XmlFormatWriterDelegate(xmlWriter, obj, context, this); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext? context) { Debug.Assert(context != null); diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContract.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContract.cs index c7e2d8d8cbfa46..2c67bd0c3518ff 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContract.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContract.cs @@ -28,6 +28,9 @@ internal abstract class DataContract // this the global dictionary for data contracts introduced for multi-file. private static readonly Dictionary s_dataContracts = new Dictionary(); + internal const string SerializerTrimmerWarning = "Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the " + + "required types are preserved."; + public static Dictionary GetDataContracts() { return s_dataContracts; @@ -66,16 +69,19 @@ internal MethodInfo? ParseMethod get { return _helper.ParseMethod; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static DataContract GetDataContract(Type type) { return GetDataContract(type.TypeHandle, type); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static DataContract GetDataContract(RuntimeTypeHandle typeHandle, Type type) { return GetDataContract(typeHandle, type, SerializationMode.SharedContract); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static DataContract GetDataContract(RuntimeTypeHandle typeHandle, Type? type, SerializationMode mode) { int id = GetId(typeHandle); @@ -83,17 +89,20 @@ internal static DataContract GetDataContract(RuntimeTypeHandle typeHandle, Type? return dataContract.GetValidContract(mode); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static DataContract GetDataContract(int id, RuntimeTypeHandle typeHandle, SerializationMode mode) { DataContract dataContract = GetDataContractSkipValidation(id, typeHandle, null); return dataContract.GetValidContract(mode); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static DataContract GetDataContractSkipValidation(int id, RuntimeTypeHandle typeHandle, Type? type) { return DataContractCriticalHelper.GetDataContractSkipValidation(id, typeHandle, type); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static DataContract GetGetOnlyCollectionDataContract(int id, RuntimeTypeHandle typeHandle, Type? type, SerializationMode mode) { DataContract dataContract = GetGetOnlyCollectionDataContractSkipValidation(id, typeHandle, type); @@ -105,6 +114,7 @@ internal static DataContract GetGetOnlyCollectionDataContract(int id, RuntimeTyp return dataContract; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static DataContract GetGetOnlyCollectionDataContractSkipValidation(int id, RuntimeTypeHandle typeHandle, Type? type) { return DataContractCriticalHelper.GetGetOnlyCollectionDataContractSkipValidation(id, typeHandle, type); @@ -125,16 +135,19 @@ internal static int GetId(RuntimeTypeHandle typeHandle) return DataContractCriticalHelper.GetId(typeHandle); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public static DataContract? GetBuiltInDataContract(Type type) { return DataContractCriticalHelper.GetBuiltInDataContract(type); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public static DataContract? GetBuiltInDataContract(string name, string ns) { return DataContractCriticalHelper.GetBuiltInDataContract(name, ns); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public static DataContract? GetBuiltInDataContract(string typeName) { return DataContractCriticalHelper.GetBuiltInDataContract(typeName); @@ -162,6 +175,7 @@ protected DataContractCriticalHelper Helper { return _helper; } } + [DynamicallyAccessedMembers(ClassDataContract.DataContractPreserveMemberTypes)] public Type UnderlyingType { get @@ -188,16 +202,19 @@ internal Type TypeForInitialization { return _helper.TypeForInitialization; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public virtual void WriteXmlValue(XmlWriterDelegator xmlWriter, object obj, XmlObjectSerializerWriteContext? context) { throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.Format(SR.UnexpectedContractType, DataContract.GetClrTypeFullName(this.GetType()), DataContract.GetClrTypeFullName(UnderlyingType)))); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public virtual object? ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext? context) { throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.Format(SR.UnexpectedContractType, DataContract.GetClrTypeFullName(this.GetType()), DataContract.GetClrTypeFullName(UnderlyingType)))); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public virtual void WriteXmlElement(XmlWriterDelegator xmlWriter, object? obj, XmlObjectSerializerWriteContext context, XmlDictionaryString name, XmlDictionaryString? ns) { throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.Format(SR.UnexpectedContractType, DataContract.GetClrTypeFullName(this.GetType()), DataContract.GetClrTypeFullName(UnderlyingType)))); @@ -237,6 +254,7 @@ public XmlQualifiedName StableName public virtual DataContractDictionary? KnownDataContracts { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { return _helper.KnownDataContracts; } @@ -343,6 +361,7 @@ internal class DataContractCriticalHelper private static readonly object s_namespacesLock = new object(); private static readonly object s_clrTypeStringsLock = new object(); + [DynamicallyAccessedMembers(ClassDataContract.DataContractPreserveMemberTypes)] private Type _underlyingType; private Type? _originalUnderlyingType; private bool _isReference; @@ -359,6 +378,7 @@ internal class DataContractCriticalHelper /// private Type _typeForInitialization; + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static DataContract GetDataContractSkipValidation(int id, RuntimeTypeHandle typeHandle, Type? type) { DataContract dataContract = s_dataContractCache[id]; @@ -374,6 +394,7 @@ internal static DataContract GetDataContractSkipValidation(int id, RuntimeTypeHa return dataContract; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static DataContract GetGetOnlyCollectionDataContractSkipValidation(int id, RuntimeTypeHandle typeHandle, Type? type) { DataContract dataContract = s_dataContractCache[id]; @@ -453,6 +474,7 @@ internal static int GetId(RuntimeTypeHandle typeHandle) } // check whether a corresponding update is required in ClassDataContract.IsNonAttributedTypeValidForSerialization + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private static DataContract CreateDataContract(int id, RuntimeTypeHandle typeHandle, Type? type) { DataContract? dataContract = s_dataContractCache[id]; @@ -483,6 +505,7 @@ private static DataContract CreateDataContract(int id, RuntimeTypeHandle typeHan return dataContract; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private static DataContract CreateDataContract(Type type) { type = UnwrapNullableType(type); @@ -537,6 +560,7 @@ private static void AssignDataContractToId(DataContract dataContract, int id) } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private static DataContract CreateGetOnlyCollectionDataContract(int id, RuntimeTypeHandle typeHandle, Type? type) { DataContract? dataContract = null; @@ -559,6 +583,7 @@ private static DataContract CreateGetOnlyCollectionDataContract(int id, RuntimeT } // This method returns adapter types used at runtime to create DataContract. + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static Type GetDataContractAdapterType(Type type) { // Replace the DataTimeOffset ISerializable type passed in with the internal DateTimeOffsetAdapter DataContract type. @@ -594,6 +619,7 @@ private static RuntimeTypeHandle GetDataContractAdapterTypeHandle(RuntimeTypeHan return typeHandle; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public static DataContract? GetBuiltInDataContract(Type type) { if (type.IsInterface && !CollectionDataContract.IsCollectionInterface(type)) @@ -614,6 +640,7 @@ private static RuntimeTypeHandle GetDataContractAdapterTypeHandle(RuntimeTypeHan } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public static DataContract? GetBuiltInDataContract(string name, string ns) { lock (s_initBuiltInContractsLock) @@ -632,6 +659,7 @@ private static RuntimeTypeHandle GetDataContractAdapterTypeHandle(RuntimeTypeHan } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public static DataContract? GetBuiltInDataContract(string typeName) { if (!typeName.StartsWith("System.", StringComparison.Ordinal)) @@ -710,6 +738,7 @@ private static RuntimeTypeHandle GetDataContractAdapterTypeHandle(RuntimeTypeHan } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public static bool TryCreateBuiltInDataContract(Type type, [NotNullWhen(true)] out DataContract? dataContract) { if (type.IsEnum) // Type.GetTypeCode will report Enums as TypeCode.IntXX @@ -791,6 +820,7 @@ public static bool TryCreateBuiltInDataContract(Type type, [NotNullWhen(true)] o return dataContract != null; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public static bool TryCreateBuiltInDataContract(string name, string ns, [NotNullWhen(true)] out DataContract? dataContract) { dataContract = null; @@ -989,13 +1019,16 @@ internal static void ThrowInvalidDataContractException(string? message, Type? ty throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(message)); } - internal DataContractCriticalHelper(Type type) + internal DataContractCriticalHelper( + [DynamicallyAccessedMembers(ClassDataContract.DataContractPreserveMemberTypes)] + Type type) { _underlyingType = type; SetTypeForInitialization(type); _isValueType = type.IsValueType; } + [DynamicallyAccessedMembers(ClassDataContract.DataContractPreserveMemberTypes)] internal Type UnderlyingType { get { return _underlyingType; } @@ -1062,6 +1095,7 @@ internal XmlQualifiedName StableName internal virtual DataContractDictionary? KnownDataContracts { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { return null; } set { /* do nothing */ } } @@ -1161,11 +1195,13 @@ internal void ThrowInvalidDataContractException(string message) } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static bool IsTypeSerializable(Type type) { return IsTypeSerializable(type, new HashSet()); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private static bool IsTypeSerializable(Type type, HashSet previousCollectionTypes) { Type? itemType; @@ -1277,12 +1313,14 @@ internal static bool IsValidNCName(string name) } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static XmlQualifiedName GetStableName(Type type) { bool hasDataContract; return GetStableName(type, out hasDataContract); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static XmlQualifiedName GetStableName(Type type, out bool hasDataContract) { type = UnwrapRedundantNullableType(type); @@ -1309,6 +1347,7 @@ internal static XmlQualifiedName GetStableName(Type type, out bool hasDataContra return stableName; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private static XmlQualifiedName GetDCTypeStableName(Type type, DataContractAttribute dataContractAttribute) { string? name = null, ns = null; @@ -1337,6 +1376,7 @@ private static XmlQualifiedName GetDCTypeStableName(Type type, DataContractAttri return CreateQualifiedName(name, ns); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private static XmlQualifiedName GetNonDCTypeStableName(Type type) { string? name = null, ns = null; @@ -1359,6 +1399,7 @@ private static XmlQualifiedName GetNonDCTypeStableName(Type type) return CreateQualifiedName(name, ns); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private static bool TryGetBuiltInXmlAndArrayTypeStableName(Type type, [NotNullWhen(true)] out XmlQualifiedName? stableName) { stableName = null; @@ -1401,6 +1442,7 @@ internal static bool TryGetDCAttribute(Type type, [NotNullWhen(true)] out DataCo return dataContractAttribute != null; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static XmlQualifiedName GetCollectionStableName(Type type, Type itemType, out CollectionDataContractAttribute? collectionContractAttribute) { string? name, ns; @@ -1445,6 +1487,7 @@ internal static XmlQualifiedName GetCollectionStableName(Type type, Type itemTyp return CreateQualifiedName(name, ns); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private static string GetArrayPrefix(ref Type itemType) { string arrayOfPrefix = string.Empty; @@ -1463,11 +1506,13 @@ internal static string GetCollectionNamespace(string elementNs) return IsBuiltInNamespace(elementNs) ? Globals.CollectionsNamespace : elementNs; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static XmlQualifiedName GetDefaultStableName(Type type) { return CreateQualifiedName(GetDefaultStableLocalName(type), GetDefaultStableNamespace(type)); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private static string GetDefaultStableLocalName(Type type) { if (type.IsGenericParameter) @@ -1598,12 +1643,14 @@ internal static string GetDefaultStableNamespace(string? clrNs) return new Uri(Globals.DataContractXsdBaseNamespaceUri, clrNs).AbsoluteUri; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static void GetDefaultStableName(string fullTypeName, out string localName, out string ns) { CodeTypeReference typeReference = new CodeTypeReference(fullTypeName); GetDefaultStableName(typeReference, out localName, out ns); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private static void GetDefaultStableName(CodeTypeReference typeReference, out string localName, out string ns) { string fullTypeName = typeReference.BaseType; @@ -1869,12 +1916,14 @@ private static byte[] ComputeHash(byte[] namespaces) } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private static string ExpandGenericParameters(string format, Type type) { GenericNameProvider genericNameProviderForType = new GenericNameProvider(type); return ExpandGenericParameters(format, genericNameProviderForType); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static string ExpandGenericParameters(string format, IGenericNameProvider genericNameProvider) { string? digest = null; @@ -1927,8 +1976,7 @@ internal static bool IsTypeNullable(Type type) type.GetGenericTypeDefinition() == Globals.TypeOfNullable); } - - + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static DataContractDictionary? ImportKnownTypeAttributes(Type type) { DataContractDictionary? knownDataContracts = null; @@ -1937,6 +1985,7 @@ internal static bool IsTypeNullable(Type type) return knownDataContracts; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private static void ImportKnownTypeAttributes(Type? type, Dictionary typesChecked, ref DataContractDictionary? knownDataContracts) { while (type != null && DataContract.IsTypeSerializable(type)) @@ -2033,6 +2082,7 @@ private static void ImportKnownTypeAttributes(Type? type, Dictionary } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static void CheckAndAdd(Type type, Dictionary typesChecked, [NotNullIfNotNull("nameToDataContractTable")] ref DataContractDictionary? nameToDataContractTable) { type = DataContract.UnwrapNullableType(type); @@ -2176,10 +2226,15 @@ internal interface IGenericNameProvider { int GetParameterCount(); IList GetNestedParameterCounts(); + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] string GetParameterName(int paramIndex); + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] string GetNamespaces(); string GetGenericTypeName(); - bool ParametersFromBuiltInNamespaces { get; } + bool ParametersFromBuiltInNamespaces { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] + get; + } } internal sealed class GenericNameProvider : IGenericNameProvider @@ -2213,11 +2268,13 @@ public IList GetNestedParameterCounts() return _nestedParamCounts; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public string GetParameterName(int paramIndex) { return GetStableName(paramIndex).Name; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public string GetNamespaces() { StringBuilder namespaces = new StringBuilder(); @@ -2233,6 +2290,7 @@ public string GetGenericTypeName() public bool ParametersFromBuiltInNamespaces { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { bool parametersFromBuiltInNamespaces = true; @@ -2247,6 +2305,7 @@ public bool ParametersFromBuiltInNamespaces } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private XmlQualifiedName GetStableName(int i) { object o = _genericParams[i]; diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractResolver.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractResolver.cs index ea96105f2195bd..2b9345dc2c5f23 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractResolver.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractResolver.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Diagnostics.CodeAnalysis; using System.Xml; @@ -8,7 +9,9 @@ namespace System.Runtime.Serialization { public abstract class DataContractResolver { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public abstract bool TryResolveType(Type type, Type? declaredType, DataContractResolver knownTypeResolver, out XmlDictionaryString? typeName, out XmlDictionaryString? typeNamespace); + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public abstract Type? ResolveName(string typeName, string? typeNamespace, Type? declaredType, DataContractResolver knownTypeResolver); } } diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSerializer.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSerializer.cs index 30ae159058ff20..71f4530f4f3d17 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSerializer.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSerializer.cs @@ -171,6 +171,7 @@ public ReadOnlyCollection KnownTypes internal override DataContractDictionary? KnownDataContracts { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (this.knownDataContracts == null && this.knownTypeList != null) @@ -218,6 +219,7 @@ public bool SerializeReadOnlyTypes private DataContract RootContract { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (_rootContract == null) @@ -229,11 +231,13 @@ private DataContract RootContract } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override void InternalWriteObject(XmlWriterDelegator writer, object? graph) { InternalWriteObject(writer, graph, null); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override void InternalWriteObject(XmlWriterDelegator writer, object? graph, DataContractResolver? dataContractResolver) { InternalWriteStartObject(writer, graph); @@ -241,86 +245,103 @@ internal override void InternalWriteObject(XmlWriterDelegator writer, object? gr InternalWriteEndObject(writer); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteObject(XmlWriter writer, object? graph) { WriteObjectHandleExceptions(new XmlWriterDelegator(writer), graph); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteStartObject(XmlWriter writer, object? graph) { WriteStartObjectHandleExceptions(new XmlWriterDelegator(writer), graph); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteObjectContent(XmlWriter writer, object? graph) { WriteObjectContentHandleExceptions(new XmlWriterDelegator(writer), graph); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteEndObject(XmlWriter writer) { WriteEndObjectHandleExceptions(new XmlWriterDelegator(writer)); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteStartObject(XmlDictionaryWriter writer, object? graph) { WriteStartObjectHandleExceptions(new XmlWriterDelegator(writer), graph); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteObjectContent(XmlDictionaryWriter writer, object? graph) { WriteObjectContentHandleExceptions(new XmlWriterDelegator(writer), graph); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteEndObject(XmlDictionaryWriter writer) { WriteEndObjectHandleExceptions(new XmlWriterDelegator(writer)); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public void WriteObject(XmlDictionaryWriter writer, object? graph, DataContractResolver? dataContractResolver) { WriteObjectHandleExceptions(new XmlWriterDelegator(writer), graph, dataContractResolver); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadObject(XmlReader reader) { return ReadObjectHandleExceptions(new XmlReaderDelegator(reader), true /*verifyObjectName*/); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadObject(XmlReader reader, bool verifyObjectName) { return ReadObjectHandleExceptions(new XmlReaderDelegator(reader), verifyObjectName); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override bool IsStartObject(XmlReader reader) { return IsStartObjectHandleExceptions(new XmlReaderDelegator(reader)); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadObject(XmlDictionaryReader reader, bool verifyObjectName) { return ReadObjectHandleExceptions(new XmlReaderDelegator(reader), verifyObjectName); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override bool IsStartObject(XmlDictionaryReader reader) { return IsStartObjectHandleExceptions(new XmlReaderDelegator(reader)); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public object? ReadObject(XmlDictionaryReader reader, bool verifyObjectName, DataContractResolver? dataContractResolver) { return ReadObjectHandleExceptions(new XmlReaderDelegator(reader), verifyObjectName, dataContractResolver); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override void InternalWriteStartObject(XmlWriterDelegator writer, object? graph) { WriteRootElement(writer, RootContract, _rootName, _rootNamespace, _needsContractNsAtRoot); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override void InternalWriteObjectContent(XmlWriterDelegator writer, object? graph) { InternalWriteObjectContent(writer, graph, null); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal void InternalWriteObjectContent(XmlWriterDelegator writer, object? graph, DataContractResolver? dataContractResolver) { if (MaxItemsInObjectGraph == 0) @@ -377,6 +398,7 @@ internal void InternalWriteObjectContent(XmlWriterDelegator writer, object? grap } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static DataContract GetDataContract(DataContract declaredTypeContract, Type declaredType, Type objectType) { if (declaredType.IsInterface && CollectionDataContract.IsCollectionInterface(declaredType)) @@ -393,6 +415,7 @@ internal static DataContract GetDataContract(DataContract declaredTypeContract, } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override void InternalWriteEndObject(XmlWriterDelegator writer) { if (!IsRootXmlAny(_rootName, RootContract)) @@ -401,11 +424,13 @@ internal override void InternalWriteEndObject(XmlWriterDelegator writer) } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override object? InternalReadObject(XmlReaderDelegator xmlReader, bool verifyObjectName) { return InternalReadObject(xmlReader, verifyObjectName, null); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override object? InternalReadObject(XmlReaderDelegator xmlReader, bool verifyObjectName, DataContractResolver? dataContractResolver) { if (MaxItemsInObjectGraph == 0) @@ -454,6 +479,7 @@ internal override void InternalWriteEndObject(XmlWriterDelegator writer) return context.InternalDeserialize(xmlReader, _rootType, contract, null, null); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override bool InternalIsStartObject(XmlReaderDelegator reader) { return IsRootElement(reader, RootContract, _rootName, _rootNamespace); @@ -470,6 +496,7 @@ internal override bool InternalIsStartObject(XmlReaderDelegator reader) } [return: NotNullIfNotNull("oldObj")] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static object? SurrogateToDataContractType(ISerializationSurrogateProvider serializationSurrogateProvider, object? oldObj, Type surrogatedDeclaredType, ref Type objType) { object? obj = DataContractSurrogateCaller.GetObjectToSerialize(serializationSurrogateProvider, oldObj, objType, surrogatedDeclaredType); @@ -480,6 +507,7 @@ internal override bool InternalIsStartObject(XmlReaderDelegator reader) return obj; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static Type GetSurrogatedType(ISerializationSurrogateProvider serializationSurrogateProvider, Type type) { return DataContractSurrogateCaller.GetDataContractType(serializationSurrogateProvider, DataContract.UnwrapNullableType(type)); diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSet.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSet.cs index 69f10044954474..61567c4faacf77 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSet.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSet.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Text; using DataContractDictionary = System.Collections.Generic.Dictionary; +using System.Diagnostics.CodeAnalysis; namespace System.Runtime.Serialization { @@ -30,6 +31,7 @@ internal DataContractSet(IDataContractSurrogate dataContractSurrogate, ICollecti } #endif + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal DataContractSet(DataContractSet dataContractSet) { if (dataContractSet == null) @@ -88,6 +90,7 @@ private Hashtable SurrogateDataTable } #endif + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal void Add(Type type) { DataContract dataContract = GetDataContract(type); @@ -101,11 +104,13 @@ internal static void EnsureTypeNotGeneric(Type type) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.Format(SR.GenericTypeNotExportable, type))); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void Add(DataContract dataContract) { Add(dataContract.StableName, dataContract); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public void Add(XmlQualifiedName name, DataContract dataContract) { if (dataContract.IsBuiltInDataContract) @@ -113,6 +118,7 @@ public void Add(XmlQualifiedName name, DataContract dataContract) InternalAdd(name, dataContract); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal void InternalAdd(XmlQualifiedName name, DataContract dataContract) { DataContract? dataContractInSet = null; @@ -148,6 +154,7 @@ internal void InternalAdd(XmlQualifiedName name, DataContract dataContract) } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void AddClassDataContract(ClassDataContract classDataContract) { if (classDataContract.BaseContract != null) @@ -180,6 +187,7 @@ private void AddClassDataContract(ClassDataContract classDataContract) AddKnownDataContracts(classDataContract.KnownDataContracts); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void AddCollectionDataContract(CollectionDataContract collectionDataContract) { if (collectionDataContract.IsDictionary) @@ -196,11 +204,13 @@ private void AddCollectionDataContract(CollectionDataContract collectionDataCont AddKnownDataContracts(collectionDataContract.KnownDataContracts); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void AddXmlDataContract(XmlDataContract xmlDataContract) { AddKnownDataContracts(xmlDataContract.KnownDataContracts); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void AddKnownDataContracts(DataContractDictionary? knownDataContracts) { if (knownDataContracts != null) @@ -212,6 +222,7 @@ private void AddKnownDataContracts(DataContractDictionary? knownDataContracts) } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal DataContract GetDataContract(Type clrType) { #if SUPPORT_SURROGATE @@ -241,6 +252,7 @@ internal DataContract GetDataContract(Type clrType) return dataContract; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal DataContract GetMemberTypeDataContract(DataMember dataMember) { Type dataMemberType = dataMember.MemberType; @@ -265,6 +277,7 @@ internal DataContract GetMemberTypeDataContract(DataMember dataMember) } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal DataContract GetItemTypeDataContract(CollectionDataContract collectionContract) { if (collectionContract.ItemType != null) diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSurrogateCaller.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSurrogateCaller.cs index 2ef49f1e56ca69..7ce7f2c33781b0 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSurrogateCaller.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSurrogateCaller.cs @@ -11,6 +11,7 @@ namespace System.Runtime.Serialization internal static class DataContractSurrogateCaller { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static Type GetDataContractType(ISerializationSurrogateProvider surrogateProvider, Type type) { if (DataContract.GetBuiltInDataContract(type) != null) @@ -19,6 +20,7 @@ internal static Type GetDataContractType(ISerializationSurrogateProvider surroga } [return: NotNullIfNotNull("obj")] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static object? GetObjectToSerialize(ISerializationSurrogateProvider surrogateProvider, object? obj, Type objType, Type membertype) { if (obj == null) @@ -29,6 +31,7 @@ internal static Type GetDataContractType(ISerializationSurrogateProvider surroga } [return: NotNullIfNotNull("obj")] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static object? GetDeserializedObject(ISerializationSurrogateProvider surrogateProvider, object? obj, Type objType, Type memberType) { if (obj == null) diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataMember.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataMember.cs index 47e6106473a1a5..5d2ccfa43136a6 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataMember.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataMember.cs @@ -8,7 +8,7 @@ using System.Reflection; using System.Xml; using System.Security; - +using System.Diagnostics.CodeAnalysis; namespace System.Runtime.Serialization { @@ -89,12 +89,14 @@ internal Type MemberType internal DataContract MemberTypeContract { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { return _helper.MemberTypeContract; } } internal PrimitiveDataContract? MemberPrimitiveContract { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { return _helper.MemberPrimitiveContract; @@ -164,6 +166,7 @@ internal CriticalHelper(MemberInfo memberInfo) { _emitDefaultValue = Globals.DefaultEmitDefaultValue; _memberInfo = memberInfo; + _memberPrimitiveContract = PrimitiveDataContract.NullContract; } internal MemberInfo MemberInfo @@ -228,6 +231,7 @@ internal Type MemberType internal DataContract MemberTypeContract { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (_memberTypeContract == null) @@ -262,10 +266,11 @@ internal DataMember? ConflictingMember set { _conflictingMember = value; } } - private PrimitiveDataContract? _memberPrimitiveContract = PrimitiveDataContract.NullContract; + private PrimitiveDataContract? _memberPrimitiveContract; internal PrimitiveDataContract? MemberPrimitiveContract { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (_memberPrimitiveContract == PrimitiveDataContract.NullContract) diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/EnumDataContract.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/EnumDataContract.cs index cbb4d22476fc98..a340de1f516441 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/EnumDataContract.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/EnumDataContract.cs @@ -21,6 +21,7 @@ internal sealed class EnumDataContract : DataContract public XmlQualifiedName? BaseContractName { get; set; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal EnumDataContract(Type type) : base(new EnumDataContractCriticalHelper(type)) { _helper = (base.Helper as EnumDataContractCriticalHelper)!; @@ -96,7 +97,10 @@ internal static void Add(Type type, string localName) s_nameToType.Add(stableName, type); } - internal EnumDataContractCriticalHelper(Type type) : base(type) + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] + internal EnumDataContractCriticalHelper( + [DynamicallyAccessedMembers(ClassDataContract.DataContractPreserveMemberTypes)] + Type type) : base(type) { this.StableName = DataContract.GetStableName(type, out _hasDataContract); Type baseType = Enum.GetUnderlyingType(type); @@ -355,11 +359,13 @@ internal long GetEnumValueFromString(string value) } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator xmlWriter, object obj, XmlObjectSerializerWriteContext? context) { WriteEnumValue(xmlWriter, obj); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext? context) { object obj = ReadEnumValue(xmlReader); diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/GenericParameterDataContract.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/GenericParameterDataContract.cs index 9eca66158743cf..8f5bd20805c9de 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/GenericParameterDataContract.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/GenericParameterDataContract.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; namespace System.Runtime.Serialization { @@ -10,6 +11,7 @@ internal sealed class GenericParameterDataContract : DataContract { private readonly GenericParameterDataContractCriticalHelper _helper; + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal GenericParameterDataContract(Type type) : base(new GenericParameterDataContractCriticalHelper(type)) { @@ -34,7 +36,10 @@ private sealed class GenericParameterDataContractCriticalHelper : DataContract.D { private readonly int _parameterPosition; - internal GenericParameterDataContractCriticalHelper(Type type) + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] + internal GenericParameterDataContractCriticalHelper( + [DynamicallyAccessedMembers(ClassDataContract.DataContractPreserveMemberTypes)] + Type type) : base(type) { SetDataContractName(DataContract.GetStableName(type)); diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Globals.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Globals.cs index eb24db27f6a771..02cd2281a8d789 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Globals.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Globals.cs @@ -11,7 +11,7 @@ using System.Collections.Generic; using System.Linq; using System.Diagnostics; - +using System.Diagnostics.CodeAnalysis; namespace System.Runtime.Serialization { @@ -733,6 +733,7 @@ internal static Type TypeOfDictionaryGeneric private static Type? s_typeOfHashtable; internal static Type TypeOfHashtable { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (s_typeOfHashtable == null) @@ -787,6 +788,7 @@ internal static Uri DataContractXsdBaseNamespaceUri private static readonly Type? s_typeOfScriptObject; + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static ClassDataContract CreateScriptObjectClassDataContract() { Debug.Assert(s_typeOfScriptObject != null); diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/DataContractJsonSerializer.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/DataContractJsonSerializer.cs index f29eafb3ddb208..74f4d0c0e0930c 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/DataContractJsonSerializer.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/DataContractJsonSerializer.cs @@ -26,8 +26,6 @@ public sealed class DataContractJsonSerializer : XmlObjectSerializer private const char LOW_SURROGATE_END = (char)0xdfff; private const char MAX_CHAR = (char)0xfffe; private const char WHITESPACE = ' '; - internal const string SerializerTrimmerWarning = "Json Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the " + - "required types are preserved."; internal IList? knownTypeList; @@ -42,43 +40,43 @@ public sealed class DataContractJsonSerializer : XmlObjectSerializer private readonly DataContractJsonSerializerImpl _serializer; private readonly bool _ignoreExtensionDataObject; - [RequiresUnreferencedCode(SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public DataContractJsonSerializer(Type type) { _serializer = new DataContractJsonSerializerImpl(type); } - [RequiresUnreferencedCode(SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public DataContractJsonSerializer(Type type, string? rootName) : this(type, rootName, null) { } - [RequiresUnreferencedCode(SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public DataContractJsonSerializer(Type type, XmlDictionaryString? rootName) : this(type, rootName, null) { } - [RequiresUnreferencedCode(SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public DataContractJsonSerializer(Type type, IEnumerable? knownTypes) { _serializer = new DataContractJsonSerializerImpl(type, knownTypes); } - [RequiresUnreferencedCode(SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public DataContractJsonSerializer(Type type, string? rootName, IEnumerable? knownTypes) : this(type, new DataContractJsonSerializerSettings() { RootName = rootName, KnownTypes = knownTypes }) { } - [RequiresUnreferencedCode(SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public DataContractJsonSerializer(Type type, XmlDictionaryString? rootName, IEnumerable? knownTypes) { _serializer = new DataContractJsonSerializerImpl(type, rootName, knownTypes); } - [RequiresUnreferencedCode(SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public DataContractJsonSerializer(Type type, DataContractJsonSerializerSettings? settings) { _serializer = new DataContractJsonSerializerImpl(type, settings); @@ -110,6 +108,7 @@ public ReadOnlyCollection KnownTypes internal override DataContractDictionary? KnownDataContracts { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (this.knownDataContracts == null && this.knownTypeList != null) @@ -174,6 +173,7 @@ internal static void CheckIfTypeIsReference(DataContract dataContract) } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static DataContract GetDataContract(DataContract declaredTypeContract, Type declaredType, Type objectType) { DataContract contract = DataContractSerializer.GetDataContract(declaredTypeContract, declaredType, objectType); @@ -181,36 +181,43 @@ internal static DataContract GetDataContract(DataContract declaredTypeContract, return contract; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteObject(Stream stream, object? graph) { _serializer.WriteObject(stream, graph); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteObject(XmlWriter writer, object? graph) { _serializer.WriteObject(writer, graph); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteObject(XmlDictionaryWriter writer, object? graph) { _serializer.WriteObject(writer, graph); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadObject(Stream stream) { return _serializer.ReadObject(stream); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadObject(XmlReader reader) { return _serializer.ReadObject(reader); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadObject(XmlReader reader, bool verifyObjectName) { return _serializer.ReadObject(reader, verifyObjectName); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadObject(XmlDictionaryReader reader) { return _serializer.ReadObject(reader); @@ -434,58 +441,67 @@ internal static string ConvertXmlNameToJsonName(string xmlName) return (xmlName == null) ? null : new XmlDictionary().Add(ConvertXmlNameToJsonName(xmlName.Value)); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static object? ReadJsonValue(DataContract contract, XmlReaderDelegator reader, XmlObjectSerializerReadContextComplexJson context) { return JsonDataContract.GetJsonDataContract(contract).ReadJsonValue(reader, context); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static void WriteJsonValue(JsonDataContract contract, XmlWriterDelegator writer, object graph, XmlObjectSerializerWriteContextComplexJson context, RuntimeTypeHandle declaredTypeHandle) { contract.WriteJsonValue(writer, graph, context, declaredTypeHandle); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteStartObject(XmlWriter writer, object? graph) { _serializer.WriteStartObject(writer, graph); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteStartObject(XmlDictionaryWriter writer, object? graph) { _serializer.WriteStartObject(writer, graph); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteObjectContent(XmlWriter writer, object? graph) { _serializer.WriteObjectContent(writer, graph); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteObjectContent(XmlDictionaryWriter writer, object? graph) { _serializer.WriteObjectContent(writer, graph); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteEndObject(XmlWriter writer) { _serializer.WriteEndObject(writer); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteEndObject(XmlDictionaryWriter writer) { _serializer.WriteEndObject(writer); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadObject(XmlDictionaryReader reader, bool verifyObjectName) { return _serializer.ReadObject(reader, verifyObjectName); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override bool IsStartObject(XmlReader reader) { return _serializer.IsStartObject(reader); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override bool IsStartObject(XmlDictionaryReader reader) { return _serializer.IsStartObject(reader); @@ -508,25 +524,25 @@ internal sealed class DataContractJsonSerializerImpl : XmlObjectSerializer private DateTimeFormat? _dateTimeFormat; private bool _useSimpleDictionaryFormat; - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public DataContractJsonSerializerImpl(Type type) : this(type, (IEnumerable?)null) { } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public DataContractJsonSerializerImpl(Type type, IEnumerable? knownTypes) : this(type, null, knownTypes, int.MaxValue, false, false) { } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public DataContractJsonSerializerImpl(Type type, XmlDictionaryString? rootName, IEnumerable? knownTypes) : this(type, rootName, knownTypes, int.MaxValue, false, false) { } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal DataContractJsonSerializerImpl(Type type, XmlDictionaryString? rootName, IEnumerable? knownTypes, @@ -538,7 +554,7 @@ internal DataContractJsonSerializerImpl(Type type, Initialize(type, rootName, knownTypes, maxItemsInObjectGraph, ignoreExtensionDataObject, emitTypeInformation, false, null, false); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public DataContractJsonSerializerImpl(Type type, DataContractJsonSerializerSettings? settings) { if (settings == null) @@ -572,6 +588,7 @@ public ReadOnlyCollection KnownTypes internal override DataContractDictionary? KnownDataContracts { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (this.knownDataContracts == null && this.knownTypeList != null) @@ -633,6 +650,7 @@ public bool UseSimpleDictionaryFormat private DataContract RootContract { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (_rootContract == null) @@ -652,57 +670,66 @@ private XmlDictionaryString RootName } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override bool IsStartObject(XmlReader reader) { // No need to pass in DateTimeFormat to JsonReaderDelegator: no DateTimes will be read in IsStartObject return IsStartObjectHandleExceptions(new JsonReaderDelegator(reader)); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override bool IsStartObject(XmlDictionaryReader reader) { // No need to pass in DateTimeFormat to JsonReaderDelegator: no DateTimes will be read in IsStartObject return IsStartObjectHandleExceptions(new JsonReaderDelegator(reader)); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadObject(Stream stream) { CheckNull(stream, nameof(stream)); return ReadObject(JsonReaderWriterFactory.CreateJsonReader(stream, XmlDictionaryReaderQuotas.Max)); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadObject(XmlReader reader) { return ReadObjectHandleExceptions(new JsonReaderDelegator(reader, this.DateTimeFormat), true); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadObject(XmlReader reader, bool verifyObjectName) { return ReadObjectHandleExceptions(new JsonReaderDelegator(reader, this.DateTimeFormat), verifyObjectName); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadObject(XmlDictionaryReader reader) { return ReadObjectHandleExceptions(new JsonReaderDelegator(reader, this.DateTimeFormat), true); // verifyObjectName } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadObject(XmlDictionaryReader reader, bool verifyObjectName) { return ReadObjectHandleExceptions(new JsonReaderDelegator(reader, this.DateTimeFormat), verifyObjectName); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteEndObject(XmlWriter writer) { // No need to pass in DateTimeFormat to JsonWriterDelegator: no DateTimes will be written in end object WriteEndObjectHandleExceptions(new JsonWriterDelegator(writer)); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteEndObject(XmlDictionaryWriter writer) { // No need to pass in DateTimeFormat to JsonWriterDelegator: no DateTimes will be written in end object WriteEndObjectHandleExceptions(new JsonWriterDelegator(writer)); } - + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteObject(Stream stream, object? graph) { CheckNull(stream, nameof(stream)); @@ -711,32 +738,38 @@ public override void WriteObject(Stream stream, object? graph) jsonWriter.Flush(); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteObject(XmlWriter writer, object? graph) { WriteObjectHandleExceptions(new JsonWriterDelegator(writer, this.DateTimeFormat), graph); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteObject(XmlDictionaryWriter writer, object? graph) { WriteObjectHandleExceptions(new JsonWriterDelegator(writer, this.DateTimeFormat), graph); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteObjectContent(XmlWriter writer, object? graph) { WriteObjectContentHandleExceptions(new JsonWriterDelegator(writer, this.DateTimeFormat), graph); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteObjectContent(XmlDictionaryWriter writer, object? graph) { WriteObjectContentHandleExceptions(new JsonWriterDelegator(writer, this.DateTimeFormat), graph); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteStartObject(XmlWriter writer, object? graph) { // No need to pass in DateTimeFormat to JsonWriterDelegator: no DateTimes will be written in start object WriteStartObjectHandleExceptions(new JsonWriterDelegator(writer), graph); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteStartObject(XmlDictionaryWriter writer, object? graph) { // No need to pass in DateTimeFormat to JsonWriterDelegator: no DateTimes will be written in start object @@ -799,7 +832,7 @@ internal static bool IsJsonLocalName(XmlReaderDelegator reader, string elementNa return false; } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static object? ReadJsonValue(DataContract contract, XmlReaderDelegator reader, XmlObjectSerializerReadContextComplexJson? context) { return JsonDataContract.GetJsonDataContract(contract).ReadJsonValue(reader, context); @@ -810,7 +843,7 @@ internal static void WriteJsonNull(XmlWriterDelegator writer) writer.WriteAttributeString(null, JsonGlobals.typeString, null, JsonGlobals.nullString); // prefix // namespace } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static void WriteJsonValue(JsonDataContract contract, XmlWriterDelegator writer, object graph, XmlObjectSerializerWriteContextComplexJson? context, RuntimeTypeHandle declaredTypeHandle) { contract.WriteJsonValue(writer, graph, context, declaredTypeHandle); @@ -826,6 +859,7 @@ internal static void WriteJsonValue(JsonDataContract contract, XmlWriterDelegato return (graph == null) ? _rootType : graph.GetType(); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override bool InternalIsStartObject(XmlReaderDelegator reader) { if (IsRootElement(reader, RootContract, RootName, XmlDictionaryString.Empty)) @@ -836,7 +870,7 @@ internal override bool InternalIsStartObject(XmlReaderDelegator reader) return IsJsonLocalName(reader, RootName.Value); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override object? InternalReadObject(XmlReaderDelegator xmlReader, bool verifyObjectName) { if (MaxItemsInObjectGraph == 0) @@ -866,12 +900,13 @@ internal override bool InternalIsStartObject(XmlReaderDelegator reader) return context.InternalDeserialize(xmlReader, _rootType, contract, null, null); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override void InternalWriteEndObject(XmlWriterDelegator writer) { writer.WriteEndElement(); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override void InternalWriteObject(XmlWriterDelegator writer, object? graph) { InternalWriteStartObject(writer, graph); @@ -879,7 +914,7 @@ internal override void InternalWriteObject(XmlWriterDelegator writer, object? gr InternalWriteEndObject(writer); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override void InternalWriteObjectContent(XmlWriterDelegator writer, object? graph) { if (MaxItemsInObjectGraph == 0) @@ -932,6 +967,7 @@ internal override void InternalWriteObjectContent(XmlWriterDelegator writer, obj } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override void InternalWriteStartObject(XmlWriterDelegator writer, object? graph) { if (_rootNameRequiresMapping) @@ -945,7 +981,7 @@ internal override void InternalWriteStartObject(XmlWriterDelegator writer, objec } } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void AddCollectionItemTypeToKnownTypes(Type knownType) { Type? itemType; @@ -962,7 +998,7 @@ private void AddCollectionItemTypeToKnownTypes(Type knownType) } [MemberNotNull(nameof(_rootType))] - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void Initialize(Type type, IEnumerable? knownTypes, int maxItemsInObjectGraph, @@ -1001,7 +1037,7 @@ private void Initialize(Type type, } [MemberNotNull(nameof(_rootType))] - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void Initialize(Type type, XmlDictionaryString? rootName, IEnumerable? knownTypes, @@ -1025,6 +1061,7 @@ internal static void CheckIfTypeIsReference(DataContract dataContract) } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static DataContract GetDataContract(DataContract declaredTypeContract, Type declaredType, Type objectType) { DataContract contract = DataContractSerializer.GetDataContract(declaredTypeContract, declaredType, objectType); diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonByteArrayDataContract.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonByteArrayDataContract.cs index eb43e5e96253c0..5518442c8649da 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonByteArrayDataContract.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonByteArrayDataContract.cs @@ -12,13 +12,13 @@ namespace System.Runtime.Serialization.Json { internal sealed class JsonByteArrayDataContract : JsonDataContract { - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public JsonByteArrayDataContract(ByteArrayDataContract traditionalByteArrayDataContract) : base(traditionalByteArrayDataContract) { } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadJsonValueCore(XmlReaderDelegator jsonReader, XmlObjectSerializerReadContextComplexJson? context) { if (context == null) diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonClassDataContract.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonClassDataContract.cs index 8b3494225cb083..148b3eebd7d2b1 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonClassDataContract.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonClassDataContract.cs @@ -14,13 +14,14 @@ internal sealed class JsonClassDataContract : JsonDataContract { private readonly JsonClassDataContractCriticalHelper _helper; - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public JsonClassDataContract(ClassDataContract traditionalDataContract) : base(new JsonClassDataContractCriticalHelper(traditionalDataContract)) { _helper = (base.Helper as JsonClassDataContractCriticalHelper)!; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private JsonFormatClassReaderDelegate CreateJsonFormatReaderDelegate() { return new ReflectionJsonClassReader(TraditionalClassDataContract).ReflectionReadClass; @@ -28,7 +29,7 @@ private JsonFormatClassReaderDelegate CreateJsonFormatReaderDelegate() internal JsonFormatClassReaderDelegate JsonFormatReaderDelegate { - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (_helper.JsonFormatReaderDelegate == null) @@ -56,6 +57,7 @@ internal JsonFormatClassReaderDelegate JsonFormatReaderDelegate } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private JsonFormatClassWriterDelegate CreateJsonFormatWriterDelegate() { return new ReflectionJsonFormatWriter().ReflectionWriteClass; @@ -63,7 +65,7 @@ private JsonFormatClassWriterDelegate CreateJsonFormatWriterDelegate() internal JsonFormatClassWriterDelegate JsonFormatWriterDelegate { - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (_helper.JsonFormatWriterDelegate == null) @@ -97,7 +99,7 @@ internal JsonFormatClassWriterDelegate JsonFormatWriterDelegate private ClassDataContract TraditionalClassDataContract => _helper.TraditionalClassDataContract; - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadJsonValueCore(XmlReaderDelegator jsonReader, XmlObjectSerializerReadContextComplexJson? context) { jsonReader.Read(); @@ -106,7 +108,7 @@ internal JsonFormatClassWriterDelegate JsonFormatWriterDelegate return o; } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteJsonValueCore(XmlWriterDelegator jsonWriter, object obj, XmlObjectSerializerWriteContextComplexJson? context, RuntimeTypeHandle declaredTypeHandle) { Debug.Assert(context != null); @@ -122,7 +124,7 @@ private sealed class JsonClassDataContractCriticalHelper : JsonDataContractCriti private readonly ClassDataContract _traditionalClassDataContract; private readonly string _typeName; - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public JsonClassDataContractCriticalHelper(ClassDataContract traditionalDataContract) : base(traditionalDataContract) { diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonCollectionDataContract.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonCollectionDataContract.cs index 175835807faa24..8fe2e96c10c4a6 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonCollectionDataContract.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonCollectionDataContract.cs @@ -14,13 +14,14 @@ internal sealed class JsonCollectionDataContract : JsonDataContract { private readonly JsonCollectionDataContractCriticalHelper _helper; - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public JsonCollectionDataContract(CollectionDataContract traditionalDataContract) : base(new JsonCollectionDataContractCriticalHelper(traditionalDataContract)) { _helper = (base.Helper as JsonCollectionDataContractCriticalHelper)!; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private JsonFormatCollectionReaderDelegate CreateJsonFormatReaderDelegate() { return new ReflectionJsonCollectionReader().ReflectionReadCollection; @@ -28,7 +29,7 @@ private JsonFormatCollectionReaderDelegate CreateJsonFormatReaderDelegate() internal JsonFormatCollectionReaderDelegate JsonFormatReaderDelegate { - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (_helper.JsonFormatReaderDelegate == null) @@ -56,6 +57,7 @@ internal JsonFormatCollectionReaderDelegate JsonFormatReaderDelegate } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private JsonFormatGetOnlyCollectionReaderDelegate CreateJsonFormatGetOnlyReaderDelegate() { return new ReflectionJsonCollectionReader().ReflectionReadGetOnlyCollection; @@ -63,7 +65,7 @@ private JsonFormatGetOnlyCollectionReaderDelegate CreateJsonFormatGetOnlyReaderD internal JsonFormatGetOnlyCollectionReaderDelegate JsonFormatGetOnlyReaderDelegate { - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (_helper.JsonFormatGetOnlyReaderDelegate == null) @@ -97,7 +99,7 @@ internal JsonFormatGetOnlyCollectionReaderDelegate JsonFormatGetOnlyReaderDelega } } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private JsonFormatCollectionWriterDelegate CreateJsonFormatWriterDelegate() { return new ReflectionJsonFormatWriter().ReflectionWriteCollection; @@ -106,7 +108,7 @@ private JsonFormatCollectionWriterDelegate CreateJsonFormatWriterDelegate() internal JsonFormatCollectionWriterDelegate JsonFormatWriterDelegate { - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (_helper.JsonFormatWriterDelegate == null) @@ -136,7 +138,7 @@ internal JsonFormatCollectionWriterDelegate JsonFormatWriterDelegate private CollectionDataContract TraditionalCollectionDataContract => _helper.TraditionalCollectionDataContract; - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadJsonValueCore(XmlReaderDelegator jsonReader, XmlObjectSerializerReadContextComplexJson? context) { Debug.Assert(context != null); @@ -157,7 +159,7 @@ internal JsonFormatCollectionWriterDelegate JsonFormatWriterDelegate return o; } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteJsonValueCore(XmlWriterDelegator jsonWriter, object obj, XmlObjectSerializerWriteContextComplexJson? context, RuntimeTypeHandle declaredTypeHandle) { Debug.Assert(context != null); @@ -173,7 +175,7 @@ private sealed class JsonCollectionDataContractCriticalHelper : JsonDataContract private JsonFormatCollectionWriterDelegate? _jsonFormatWriterDelegate; private readonly CollectionDataContract _traditionalCollectionDataContract; - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public JsonCollectionDataContractCriticalHelper(CollectionDataContract traditionalDataContract) : base(traditionalDataContract) { diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonDataContract.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonDataContract.cs index a638ff086e3620..472413f221b880 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonDataContract.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonDataContract.cs @@ -15,7 +15,7 @@ internal class JsonDataContract { private readonly JsonDataContractCriticalHelper _helper; - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected JsonDataContract(DataContract traditionalDataContract) { _helper = new JsonDataContractCriticalHelper(traditionalDataContract); @@ -62,13 +62,13 @@ internal static JsonReadWriteDelegates GetReadWriteDelegatesFromGeneratedAssembl return result; } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public static JsonDataContract GetJsonDataContract(DataContract traditionalDataContract) { return JsonDataContractCriticalHelper.GetJsonDataContract(traditionalDataContract); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public object? ReadJsonValue(XmlReaderDelegator jsonReader, XmlObjectSerializerReadContextComplexJson? context) { PushKnownDataContracts(context); @@ -77,13 +77,13 @@ public static JsonDataContract GetJsonDataContract(DataContract traditionalDataC return deserializedObject; } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public virtual object? ReadJsonValueCore(XmlReaderDelegator jsonReader, XmlObjectSerializerReadContextComplexJson? context) { return TraditionalDataContract.ReadXmlValue(jsonReader, context); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public void WriteJsonValue(XmlWriterDelegator jsonWriter, object obj, XmlObjectSerializerWriteContextComplexJson? context, RuntimeTypeHandle declaredTypeHandle) { PushKnownDataContracts(context); @@ -91,7 +91,7 @@ public void WriteJsonValue(XmlWriterDelegator jsonWriter, object obj, XmlObjectS PopKnownDataContracts(context); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public virtual void WriteJsonValueCore(XmlWriterDelegator jsonWriter, object obj, XmlObjectSerializerWriteContextComplexJson? context, RuntimeTypeHandle declaredTypeHandle) { TraditionalDataContract.WriteXmlValue(jsonWriter, obj, context); @@ -148,7 +148,7 @@ internal class JsonDataContractCriticalHelper private readonly DataContract _traditionalDataContract; private readonly string _typeName; - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal JsonDataContractCriticalHelper(DataContract traditionalDataContract) { _traditionalDataContract = traditionalDataContract; @@ -162,7 +162,7 @@ internal JsonDataContractCriticalHelper(DataContract traditionalDataContract) internal virtual string TypeName => _typeName; - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public static JsonDataContract GetJsonDataContract(DataContract traditionalDataContract) { int id = JsonDataContractCriticalHelper.GetId(traditionalDataContract.UnderlyingType.TypeHandle); @@ -208,7 +208,7 @@ internal static int GetId(RuntimeTypeHandle typeHandle) } } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private static JsonDataContract CreateJsonDataContract(int id, DataContract traditionalDataContract) { lock (s_createDataContractLock) @@ -272,7 +272,7 @@ private static JsonDataContract CreateJsonDataContract(int id, DataContract trad } } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void AddCollectionItemContractsToKnownDataContracts() { if (_traditionalDataContract.KnownDataContracts != null) diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonEnumDataContract.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonEnumDataContract.cs index 7fe0a429c05fe2..726eafe2ab0612 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonEnumDataContract.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonEnumDataContract.cs @@ -9,7 +9,7 @@ internal sealed class JsonEnumDataContract : JsonDataContract { private readonly JsonEnumDataContractCriticalHelper _helper; - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public JsonEnumDataContract(EnumDataContract traditionalDataContract) : base(new JsonEnumDataContractCriticalHelper(traditionalDataContract)) { @@ -18,7 +18,7 @@ public JsonEnumDataContract(EnumDataContract traditionalDataContract) public bool IsULong => _helper.IsULong; - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadJsonValueCore(XmlReaderDelegator jsonReader, XmlObjectSerializerReadContextComplexJson? context) { object enumValue; @@ -38,7 +38,7 @@ public JsonEnumDataContract(EnumDataContract traditionalDataContract) return enumValue; } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteJsonValueCore(XmlWriterDelegator jsonWriter, object obj, XmlObjectSerializerWriteContextComplexJson? context, RuntimeTypeHandle declaredTypeHandle) { if (IsULong) @@ -55,7 +55,7 @@ private sealed class JsonEnumDataContractCriticalHelper : JsonDataContractCritic { private readonly bool _isULong; - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public JsonEnumDataContractCriticalHelper(EnumDataContract traditionalEnumDataContract) : base(traditionalEnumDataContract) { diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonFormatGeneratorStatics.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonFormatGeneratorStatics.cs index 43218be2133044..d7f05cd947be5b 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonFormatGeneratorStatics.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonFormatGeneratorStatics.cs @@ -4,10 +4,10 @@ using System; using System.Collections; using System.Reflection; -using System.Runtime.Serialization.Json; using System.Xml; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; +using System.Runtime.Serialization.Json; namespace System.Runtime.Serialization { @@ -116,6 +116,7 @@ public static MethodInfo GetCurrentMethod } public static MethodInfo GetItemContractMethod { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (s_getItemContractMethod == null) @@ -128,7 +129,7 @@ public static MethodInfo GetItemContractMethod } public static MethodInfo GetJsonDataContractMethod { - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (s_getJsonDataContractMethod == null) @@ -141,6 +142,7 @@ public static MethodInfo GetJsonDataContractMethod } public static MethodInfo GetJsonMemberIndexMethod { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (s_getJsonMemberIndexMethod == null) @@ -153,6 +155,7 @@ public static MethodInfo GetJsonMemberIndexMethod } public static MethodInfo GetRevisedItemContractMethod { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (s_getRevisedItemContractMethod == null) @@ -165,6 +168,7 @@ public static MethodInfo GetRevisedItemContractMethod } public static MethodInfo GetUninitializedObjectMethod { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (s_getUninitializedObjectMethod == null) @@ -275,7 +279,7 @@ public static MethodInfo OnDeserializationMethod public static MethodInfo ReadJsonValueMethod { - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (s_readJsonValueMethod == null) @@ -395,6 +399,7 @@ public static MethodInfo WriteEndElementMethod } public static MethodInfo WriteJsonISerializableMethod { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (s_writeJsonISerializableMethod == null) @@ -419,7 +424,7 @@ public static MethodInfo WriteJsonNameWithMappingMethod } public static MethodInfo WriteJsonValueMethod { - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (s_writeJsonValueMethod == null) diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonFormatReaderGenerator.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonFormatReaderGenerator.cs index e4aeed0d50556b..68a5ddb216c8ec 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonFormatReaderGenerator.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonFormatReaderGenerator.cs @@ -29,19 +29,19 @@ public JsonFormatReaderGenerator() _helper = new CriticalHelper(); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public JsonFormatClassReaderDelegate GenerateClassReader(ClassDataContract classContract) { return _helper.GenerateClassReader(classContract); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public JsonFormatCollectionReaderDelegate GenerateCollectionReader(CollectionDataContract collectionContract) { return _helper.GenerateCollectionReader(collectionContract); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public JsonFormatGetOnlyCollectionReaderDelegate GenerateGetOnlyCollectionReader(CollectionDataContract collectionContract) { return _helper.GenerateGetOnlyCollectionReader(collectionContract); @@ -58,7 +58,7 @@ private sealed class CriticalHelper private ArgBuilder? _collectionContractArg; private ArgBuilder _emptyDictionaryStringArg = null!; // initialized in InitArgs - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public JsonFormatClassReaderDelegate GenerateClassReader(ClassDataContract classContract) { _ilg = new CodeGenerator(); @@ -120,7 +120,7 @@ public JsonFormatClassReaderDelegate GenerateClassReader(ClassDataContract class return (JsonFormatClassReaderDelegate)_ilg.EndMethod(); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public JsonFormatCollectionReaderDelegate GenerateCollectionReader(CollectionDataContract collectionContract) { _ilg = GenerateCollectionReaderHelper(collectionContract, false /*isGetOnlyCollection*/); @@ -130,7 +130,7 @@ public JsonFormatCollectionReaderDelegate GenerateCollectionReader(CollectionDat return (JsonFormatCollectionReaderDelegate)_ilg.EndMethod(); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public JsonFormatGetOnlyCollectionReaderDelegate GenerateGetOnlyCollectionReader(CollectionDataContract collectionContract) { _ilg = GenerateCollectionReaderHelper(collectionContract, true /*isGetOnlyCollection*/); @@ -189,7 +189,7 @@ private void InitArgs() _memberNamesArg = _ilg.GetArg(3); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void CreateObject(ClassDataContract classContract) { _objectType = classContract.UnderlyingType; @@ -272,7 +272,7 @@ private bool InvokeFactoryMethod(ClassDataContract classContract) return false; } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void ReadClass(ClassDataContract classContract) { if (classContract.HasExtensionData) @@ -297,7 +297,7 @@ private void ReadClass(ClassDataContract classContract) } } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void ReadMembers(ClassDataContract classContract, LocalBuilder? extensionDataLocal) { int memberCount = classContract.MemberNames!.Length; @@ -345,7 +345,7 @@ private void ReadMembers(ClassDataContract classContract, LocalBuilder? extensio _ilg.MarkLabel(endOfTypeLabel); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private int ReadMembers(ClassDataContract classContract, BitFlagsGenerator expectedElements, Label[] memberLabels, Label throwDuplicateMemberLabel, LocalBuilder memberIndexLocal) { @@ -439,7 +439,7 @@ private void ResetExpectedElements(BitFlagsGenerator expectedElements, int index expectedElements.Store(index, false); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void ReadISerializable(ClassDataContract classContract) { ConstructorInfo? ctor = classContract.UnderlyingType.GetConstructor(Globals.ScanAllMembers, JsonFormatGeneratorStatics.SerInfoCtorArgs); @@ -453,7 +453,7 @@ private void ReadISerializable(ClassDataContract classContract) _ilg.Call(ctor); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private LocalBuilder ReadValue(Type type, string name) { LocalBuilder value = _ilg.DeclareLocal(type, "valueRead"); @@ -544,6 +544,7 @@ private LocalBuilder ReadValue(Type type, string name) return value; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void InternalDeserialize(LocalBuilder value, Type type, string name) { _ilg.Load(_contextArg); @@ -560,7 +561,7 @@ private void InternalDeserialize(LocalBuilder value, Type type, string name) _ilg.Stloc(value); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void WrapNullableObject(LocalBuilder innerValue, LocalBuilder outerValue, int nullables) { Type innerType = innerValue.LocalType, outerType = outerValue.LocalType; @@ -575,7 +576,7 @@ private void WrapNullableObject(LocalBuilder innerValue, LocalBuilder outerValue _ilg.Call(outerType.GetConstructor(new Type[] { innerType })!); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void ReadCollection(CollectionDataContract collectionContract) { Type type = collectionContract.UnderlyingType; @@ -663,7 +664,7 @@ private void ReadCollection(CollectionDataContract collectionContract) if (isArray) { Debug.Assert(growingCollection != null); - MethodInfo ensureArraySizeMethod = XmlFormatGeneratorStatics.EnsureArraySizeMethod.MakeGenericMethod(itemType); + MethodInfo ensureArraySizeMethod = MakeGenericMethod(XmlFormatGeneratorStatics.EnsureArraySizeMethod, itemType); _ilg.Call(null, ensureArraySizeMethod, growingCollection, i); _ilg.Stloc(growingCollection); _ilg.StoreArrayElement(growingCollection, i, value); @@ -682,7 +683,7 @@ private void ReadCollection(CollectionDataContract collectionContract) _ilg.EndFor(); if (isArray) { - MethodInfo trimArraySizeMethod = XmlFormatGeneratorStatics.TrimArraySizeMethod.MakeGenericMethod(itemType); + MethodInfo trimArraySizeMethod = MakeGenericMethod(XmlFormatGeneratorStatics.TrimArraySizeMethod, itemType); _ilg.Call(null, trimArraySizeMethod, growingCollection, i); _ilg.Stloc(_objectLocal); _ilg.Call(_contextArg, XmlFormatGeneratorStatics.AddNewObjectWithIdMethod, objectId, _objectLocal); @@ -699,9 +700,13 @@ private void ReadCollection(CollectionDataContract collectionContract) { _ilg.EndIf(); } + + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2060:MakeGenericMethod", + Justification = "The call to MakeGenericMethod is safe due to the fact that EnsureArraySizeMethod and TrimArraySizeMethod are not annotated.")] + static MethodInfo MakeGenericMethod(MethodInfo method, Type itemType) => method.MakeGenericMethod(itemType); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void ReadSimpleDictionary(CollectionDataContract collectionContract, Type keyValueType) { Type[] keyValueTypes = keyValueType.GetGenericArguments(); @@ -794,7 +799,7 @@ private void ReadSimpleDictionary(CollectionDataContract collectionContract, Typ } } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void ReadGetOnlyCollection(CollectionDataContract collectionContract) { Type type = collectionContract.UnderlyingType; @@ -883,6 +888,7 @@ private void ReadGetOnlyCollection(CollectionDataContract collectionContract) } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private bool TryReadPrimitiveArray(Type itemType) { PrimitiveDataContract? primitiveContract = PrimitiveDataContract.GetPrimitiveDataContract(itemType); @@ -933,7 +939,7 @@ private bool TryReadPrimitiveArray(Type itemType) return false; } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private LocalBuilder ReadCollectionItem(CollectionDataContract collectionContract, Type itemType) { if (collectionContract.Kind == CollectionKind.Dictionary || collectionContract.Kind == CollectionKind.GenericDictionary) @@ -956,6 +962,7 @@ private LocalBuilder ReadCollectionItem(CollectionDataContract collectionContrac } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void StoreCollectionValue(LocalBuilder collection, LocalBuilder value, CollectionDataContract collectionContract) { if (collectionContract.Kind == CollectionKind.GenericDictionary || collectionContract.Kind == CollectionKind.Dictionary) diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonFormatWriterGenerator.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonFormatWriterGenerator.cs index a39e36802db466..c7205118d409cd 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonFormatWriterGenerator.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonFormatWriterGenerator.cs @@ -27,13 +27,13 @@ public JsonFormatWriterGenerator() _helper = new CriticalHelper(); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal JsonFormatClassWriterDelegate GenerateClassWriter(ClassDataContract classContract) { return _helper.GenerateClassWriter(classContract); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal JsonFormatCollectionWriterDelegate GenerateCollectionWriter(CollectionDataContract collectionContract) { return _helper.GenerateCollectionWriter(collectionContract); @@ -60,7 +60,7 @@ private sealed class CriticalHelper private int _typeIndex = 1; private int _childElementIndex; - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal JsonFormatClassWriterDelegate GenerateClassWriter(ClassDataContract classContract) { _ilg = new CodeGenerator(); @@ -86,7 +86,7 @@ internal JsonFormatClassWriterDelegate GenerateClassWriter(ClassDataContract cla return (JsonFormatClassWriterDelegate)_ilg.EndMethod(); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal JsonFormatCollectionWriterDelegate GenerateCollectionWriter(CollectionDataContract collectionContract) { _ilg = new CodeGenerator(); @@ -123,7 +123,7 @@ private void BeginMethod(CodeGenerator ilg, string methodName, Type delegateType ilg.BeginMethod(dynamicMethod, delegateType, methodName, paramTypes, allowPrivateMemberAccess); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void InitArgs(Type objType) { _xmlWriterArg = _ilg.GetArg(0); @@ -183,6 +183,7 @@ private void InvokeOnSerialized(ClassDataContract classContract) } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void WriteClass(ClassDataContract classContract) { InvokeOnSerializing(classContract); @@ -211,6 +212,7 @@ private void WriteClass(ClassDataContract classContract) InvokeOnSerialized(classContract); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private int WriteMembers(ClassDataContract classContract, LocalBuilder? extensionDataLocal, ClassDataContract derivedMostClassContract) { int memberCount = (classContract.BaseContract == null) ? 0 : @@ -285,7 +287,7 @@ private LocalBuilder LoadMemberValue(DataMember member) return memberValue; } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void WriteCollection(CollectionDataContract collectionContract) { LocalBuilder itemName = _ilg.DeclareLocal(typeof(XmlDictionaryString), "itemName"); @@ -330,10 +332,10 @@ private void WriteCollection(CollectionDataContract collectionContract) break; case CollectionKind.GenericCollection: case CollectionKind.GenericList: - incrementCollectionCountMethod = XmlFormatGeneratorStatics.IncrementCollectionCountGenericMethod.MakeGenericMethod(collectionContract.ItemType); + incrementCollectionCountMethod = MakeIncrementCollectionCountGenericMethod(collectionContract.ItemType); break; case CollectionKind.GenericDictionary: - incrementCollectionCountMethod = XmlFormatGeneratorStatics.IncrementCollectionCountGenericMethod.MakeGenericMethod(Globals.TypeOfKeyValuePair.MakeGenericType(collectionContract.ItemType.GetGenericArguments())); + incrementCollectionCountMethod = MakeIncrementCollectionCountGenericMethod(Globals.TypeOfKeyValuePair.MakeGenericType(collectionContract.ItemType.GetGenericArguments())); break; } if (incrementCollectionCountMethod != null) @@ -486,8 +488,13 @@ private void WriteCollection(CollectionDataContract collectionContract) _ilg.EndIf(); } } + + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2060:MakeGenericMethod", + Justification = "The call to MakeGenericMethod is safe due to the fact that IncrementCollectionCountGeneric is not annotated.")] + static MethodInfo MakeIncrementCollectionCountGenericMethod(Type itemType) => XmlFormatGeneratorStatics.IncrementCollectionCountGenericMethod.MakeGenericMethod(itemType); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private bool TryWritePrimitive(Type type, LocalBuilder? value, MemberInfo? memberInfo, LocalBuilder? arrayItemIndex, LocalBuilder? name, int nameIndex) { PrimitiveDataContract? primitiveContract = PrimitiveDataContract.GetPrimitiveDataContract(type); @@ -534,6 +541,7 @@ private bool TryWritePrimitive(Type type, LocalBuilder? value, MemberInfo? membe return true; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private bool TryWritePrimitiveArray(Type type, Type itemType, LocalBuilder value, LocalBuilder itemName) { PrimitiveDataContract? primitiveContract = PrimitiveDataContract.GetPrimitiveDataContract(itemType); @@ -599,6 +607,7 @@ private void WriteObjectAttribute() JsonGlobals.objectString /* value */); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void WriteValue(LocalBuilder memberValue) { Type memberType = memberValue.LocalType; diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonObjectDataContract.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonObjectDataContract.cs index 2da99f1eff5d2a..40e34203e1559a 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonObjectDataContract.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonObjectDataContract.cs @@ -10,13 +10,13 @@ namespace System.Runtime.Serialization.Json { internal sealed class JsonObjectDataContract : JsonDataContract { - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public JsonObjectDataContract(DataContract traditionalDataContract) : base(traditionalDataContract) { } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadJsonValueCore(XmlReaderDelegator jsonReader, XmlObjectSerializerReadContextComplexJson? context) { object? obj; @@ -56,7 +56,7 @@ public JsonObjectDataContract(DataContract traditionalDataContract) return obj; } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteJsonValueCore(XmlWriterDelegator jsonWriter, object obj, XmlObjectSerializerWriteContextComplexJson? context, RuntimeTypeHandle declaredTypeHandle) { jsonWriter.WriteAttributeString(null, JsonGlobals.typeString, null, JsonGlobals.objectString); diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonQNameDataContract.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonQNameDataContract.cs index aa6d2f137a54cc..8bc4a2d1f50424 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonQNameDataContract.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonQNameDataContract.cs @@ -12,13 +12,13 @@ namespace System.Runtime.Serialization.Json { internal sealed class JsonQNameDataContract : JsonDataContract { - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public JsonQNameDataContract(QNameDataContract traditionalQNameDataContract) : base(traditionalQNameDataContract) { } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadJsonValueCore(XmlReaderDelegator jsonReader, XmlObjectSerializerReadContextComplexJson? context) { if (context == null) diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonReaderWriterFactory.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonReaderWriterFactory.cs index 888c613a188eed..1f83baca5a5410 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonReaderWriterFactory.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonReaderWriterFactory.cs @@ -6,7 +6,6 @@ using System.Text; using System.Xml; using System.IO; -using System.Runtime.Serialization.Json; using System.Runtime.CompilerServices; namespace System.Runtime.Serialization.Json diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonStringDataContract.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonStringDataContract.cs index 19c1f28182829f..e65c58c9caed53 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonStringDataContract.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonStringDataContract.cs @@ -12,13 +12,13 @@ namespace System.Runtime.Serialization.Json { internal sealed class JsonStringDataContract : JsonDataContract { - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public JsonStringDataContract(StringDataContract traditionalStringDataContract) : base(traditionalStringDataContract) { } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadJsonValueCore(XmlReaderDelegator jsonReader, XmlObjectSerializerReadContextComplexJson? context) { if (context == null) diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonUriDataContract.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonUriDataContract.cs index 7cc8601bab92f3..bd4b68daf4103a 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonUriDataContract.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonUriDataContract.cs @@ -7,13 +7,13 @@ namespace System.Runtime.Serialization.Json { internal sealed class JsonUriDataContract : JsonDataContract { - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public JsonUriDataContract(UriDataContract traditionalUriDataContract) : base(traditionalUriDataContract) { } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadJsonValueCore(XmlReaderDelegator jsonReader, XmlObjectSerializerReadContextComplexJson? context) { if (context == null) diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonXmlDataContract.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonXmlDataContract.cs index 4fc9ac93da4ccd..cf5bf09eba9127 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonXmlDataContract.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/JsonXmlDataContract.cs @@ -11,13 +11,13 @@ namespace System.Runtime.Serialization.Json { internal sealed class JsonXmlDataContract : JsonDataContract { - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public JsonXmlDataContract(XmlDataContract traditionalXmlDataContract) : base(traditionalXmlDataContract) { } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadJsonValueCore(XmlReaderDelegator jsonReader, XmlObjectSerializerReadContextComplexJson? context) { string xmlContent = jsonReader.ReadElementContentAsString(); @@ -43,7 +43,7 @@ public JsonXmlDataContract(XmlDataContract traditionalXmlDataContract) return xmlValue; } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteJsonValueCore(XmlWriterDelegator jsonWriter, object obj, XmlObjectSerializerWriteContextComplexJson? context, RuntimeTypeHandle declaredTypeHandle) { DataContractSerializer dataContractSerializer = new DataContractSerializer(Type.GetTypeFromHandle(declaredTypeHandle), diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/ReflectionJsonFormatReader.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/ReflectionJsonFormatReader.cs index e27857f03411fe..4161f53a29aece 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/ReflectionJsonFormatReader.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/ReflectionJsonFormatReader.cs @@ -26,6 +26,7 @@ public ReflectionJsonClassReader(ClassDataContract classDataContract) _reflectionReader = new ReflectionJsonReader(); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public object ReflectionReadClass(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContextComplexJson? context, XmlDictionaryString emptyDictionaryString, XmlDictionaryString[]? memberNames) { Debug.Assert(_classContract != null); @@ -37,11 +38,13 @@ internal sealed class ReflectionJsonCollectionReader { private readonly ReflectionReader _reflectionReader = new ReflectionJsonReader(); + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public object ReflectionReadCollection(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContextComplexJson context, XmlDictionaryString emptyDictionaryString, XmlDictionaryString itemName, CollectionDataContract collectionContract) { return _reflectionReader.ReflectionReadCollection(xmlReader, context, itemName, emptyDictionaryString/*itemNamespace*/, collectionContract); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public void ReflectionReadGetOnlyCollection(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContextComplexJson context, XmlDictionaryString emptyDictionaryString, XmlDictionaryString itemName, CollectionDataContract collectionContract) { _reflectionReader.ReflectionReadGetOnlyCollection(xmlReader, context, itemName, emptyDictionaryString/*itemNamespace*/, collectionContract); @@ -50,6 +53,7 @@ public void ReflectionReadGetOnlyCollection(XmlReaderDelegator xmlReader, XmlObj internal sealed class ReflectionJsonReader : ReflectionReader { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected override void ReflectionReadMembers(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, XmlDictionaryString[] memberNames, XmlDictionaryString[]? memberNamespaces, ClassDataContract classContract, ref object obj) { var jsonContext = context as XmlObjectSerializerReadContextComplexJson; @@ -103,7 +107,7 @@ protected override string GetCollectionContractNamespace(CollectionDataContract return string.Empty; } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected override object? ReflectionReadDictionaryItem(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, CollectionDataContract collectionContract) { var jsonContext = context as XmlObjectSerializerReadContextComplexJson; @@ -115,6 +119,7 @@ protected override string GetCollectionContractNamespace(CollectionDataContract return DataContractJsonSerializer.ReadJsonValue(itemContract, xmlReader, jsonContext); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected override bool ReflectionReadSpecialCollection(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, CollectionDataContract collectionContract, object? resultCollection) { var jsonContext = context as XmlObjectSerializerReadContextComplexJson; @@ -130,6 +135,7 @@ protected override bool ReflectionReadSpecialCollection(XmlReaderDelegator xmlRe return false; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void ReadSimpleDictionary(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, CollectionDataContract collectionContract, Type keyValueType, object? dictionary) { Type[] keyValueTypes = keyValueType.GetGenericArguments(); diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/ReflectionJsonFormatWriter.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/ReflectionJsonFormatWriter.cs index c67784eed42c8e..10aff105f6b92f 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/ReflectionJsonFormatWriter.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/ReflectionJsonFormatWriter.cs @@ -18,12 +18,13 @@ internal sealed class ReflectionJsonFormatWriter { private readonly ReflectionJsonClassWriter _reflectionClassWriter = new ReflectionJsonClassWriter(); + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public void ReflectionWriteClass(XmlWriterDelegator xmlWriter, object obj, XmlObjectSerializerWriteContextComplexJson context, ClassDataContract classContract, XmlDictionaryString[]? memberNames) { _reflectionClassWriter.ReflectionWriteClass(xmlWriter, obj, context, classContract, memberNames); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public void ReflectionWriteCollection(XmlWriterDelegator xmlWriter, object obj, XmlObjectSerializerWriteContextComplexJson context, CollectionDataContract collectionContract) { JsonWriterDelegator? jsonWriter = xmlWriter as JsonWriterDelegator; @@ -136,6 +137,7 @@ private void ReflectionWriteObjectAttribute(XmlWriterDelegator xmlWriter) value: JsonGlobals.objectString); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private bool ReflectionTryWritePrimitiveArray(JsonWriterDelegator jsonWriter, object obj, Type underlyingType, Type itemType, XmlDictionaryString collectionItemName) { PrimitiveDataContract? primitiveContract = PrimitiveDataContract.GetPrimitiveDataContract(itemType); @@ -192,6 +194,7 @@ private void ReflectionWriteArrayAttribute(XmlWriterDelegator xmlWriter) internal sealed class ReflectionJsonClassWriter : ReflectionClassWriter { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected override int ReflectionWriteMembers(XmlWriterDelegator xmlWriter, object obj, XmlObjectSerializerWriteContext context, ClassDataContract classContract, ClassDataContract derivedMostClassContract, int childElementIndex, XmlDictionaryString[]? memberNames) { Debug.Assert(memberNames != null); diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/XmlObjectSerializerReadContextComplexJson.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/XmlObjectSerializerReadContextComplexJson.cs index c84405311d4094..d571c7325c48c6 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/XmlObjectSerializerReadContextComplexJson.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/XmlObjectSerializerReadContextComplexJson.cs @@ -6,7 +6,6 @@ using System.Text; using System.Reflection; using System.Xml; -using System.Runtime.Serialization.Json; using System.Runtime.Serialization; using DataContractDictionary = System.Collections.Generic.Dictionary; using System.Diagnostics; @@ -34,12 +33,13 @@ internal static XmlObjectSerializerReadContextComplexJson CreateContext(DataCont return new XmlObjectSerializerReadContextComplexJson(serializer, rootTypeDataContract); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected override object? ReadDataContractValue(DataContract dataContract, XmlReaderDelegator reader) { return DataContractJsonSerializerImpl.ReadJsonValue(dataContract, reader, this); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public int GetJsonMemberIndex(XmlReaderDelegator xmlReader, XmlDictionaryString[] memberNames, int memberIndex, ExtensionDataObject? extensionData) { int length = memberNames.Length; @@ -237,6 +237,8 @@ internal static XmlQualifiedName ParseQualifiedName(string qname) } return new XmlQualifiedName(name, ns); } + + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override DataContract GetDataContract(RuntimeTypeHandle typeHandle, Type? type) { DataContract dataContract = base.GetDataContract(typeHandle, type); @@ -244,6 +246,7 @@ internal override DataContract GetDataContract(RuntimeTypeHandle typeHandle, Typ return dataContract; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override DataContract GetDataContractSkipValidation(int typeId, RuntimeTypeHandle typeHandle, Type? type) { DataContract dataContract = base.GetDataContractSkipValidation(typeId, typeHandle, type); @@ -251,6 +254,7 @@ internal override DataContract GetDataContractSkipValidation(int typeId, Runtime return dataContract; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override DataContract GetDataContract(int id, RuntimeTypeHandle typeHandle) { DataContract dataContract = base.GetDataContract(id, typeHandle); diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/XmlObjectSerializerWriteContextComplexJson.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/XmlObjectSerializerWriteContextComplexJson.cs index ef784e7499c4cb..6519fba2a7b89d 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/XmlObjectSerializerWriteContextComplexJson.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/Json/XmlObjectSerializerWriteContextComplexJson.cs @@ -101,6 +101,7 @@ internal static string TruncateDefaultDataContractNamespace(string dataContractN return dataContractNamespace; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected override bool WriteTypeInfo(XmlWriterDelegator writer, DataContract contract, DataContract declaredContract) { if (!((object.ReferenceEquals(contract.Name, declaredContract.Name) && @@ -151,7 +152,7 @@ private void WriteTypeInfo(XmlWriterDelegator writer, string typeInformation) writer.WriteAttributeString(null, JsonGlobals.serverTypeString, null, typeInformation); } - [RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected override void WriteDataContractValue(DataContract dataContract, XmlWriterDelegator xmlWriter, object obj, RuntimeTypeHandle declaredTypeHandle) { JsonDataContract jsonDataContract = JsonDataContract.GetJsonDataContract(dataContract); @@ -173,6 +174,7 @@ internal XmlDictionaryString CollectionItemName get { return JsonGlobals.itemDictionaryString; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected override void SerializeWithXsiType(XmlWriterDelegator xmlWriter, object obj, RuntimeTypeHandle objectTypeHandle, Type? objectType, int declaredTypeID, RuntimeTypeHandle declaredTypeHandle, Type declaredType) { DataContract dataContract; @@ -204,6 +206,7 @@ protected override void SerializeWithXsiType(XmlWriterDelegator xmlWriter, objec SerializeAndVerifyType(dataContract, xmlWriter, obj, verifyKnownType, declaredType.TypeHandle, declaredType); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void HandleCollectionAssignedToObject(Type declaredType, ref DataContract dataContract, ref object obj, ref bool verifyKnownType) { if ((declaredType != dataContract.UnderlyingType) && (dataContract is CollectionDataContract)) @@ -238,6 +241,7 @@ private void HandleCollectionAssignedToObject(Type declaredType, ref DataContrac } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override void SerializeWithXsiTypeAtTopLevel(DataContract dataContract, XmlWriterDelegator xmlWriter, object obj, RuntimeTypeHandle originalDeclaredTypeHandle, Type graphType) { bool verifyKnownType = false; @@ -258,6 +262,7 @@ internal override void SerializeWithXsiTypeAtTopLevel(DataContract dataContract, SerializeAndVerifyType(dataContract, xmlWriter, obj, verifyKnownType, declaredType.TypeHandle, declaredType); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void VerifyType(DataContract dataContract, Type declaredType) { bool knownTypesAddedInCurrentScope = false; @@ -284,6 +289,7 @@ internal static void WriteJsonNameWithMapping(XmlWriterDelegator xmlWriter, XmlD xmlWriter.WriteAttributeString(null, JsonGlobals.itemString, null, memberNames[index].Value); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override void WriteExtensionDataTypeInfo(XmlWriterDelegator xmlWriter, IDataNode dataNode) { Type dataType = dataNode.DataType; @@ -326,6 +332,7 @@ internal static void VerifyObjectCompatibilityWithInterface(DataContract contrac } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal void WriteJsonISerializable(XmlWriterDelegator xmlWriter, ISerializable obj) { Type objType = obj.GetType(); @@ -342,6 +349,7 @@ internal void WriteJsonISerializable(XmlWriterDelegator xmlWriter, ISerializable } [return: NotNullIfNotNull("oldItemContract")] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static DataContract? GetRevisedItemContract(DataContract oldItemContract) { if ((oldItemContract != null) && @@ -352,6 +360,8 @@ internal void WriteJsonISerializable(XmlWriterDelegator xmlWriter, ISerializable } return oldItemContract; } + + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override DataContract GetDataContract(RuntimeTypeHandle typeHandle, Type? type) { DataContract dataContract = base.GetDataContract(typeHandle, type); @@ -359,6 +369,7 @@ internal override DataContract GetDataContract(RuntimeTypeHandle typeHandle, Typ return dataContract; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override DataContract GetDataContractSkipValidation(int typeId, RuntimeTypeHandle typeHandle, Type? type) { DataContract dataContract = base.GetDataContractSkipValidation(typeId, typeHandle, type); @@ -366,6 +377,7 @@ internal override DataContract GetDataContractSkipValidation(int typeId, Runtime return dataContract; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override DataContract GetDataContract(int id, RuntimeTypeHandle typeHandle) { DataContract dataContract = base.GetDataContract(id, typeHandle); diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/KnownTypeDataContractResolver.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/KnownTypeDataContractResolver.cs index 5c5a9291036012..ab1d030913b578 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/KnownTypeDataContractResolver.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/KnownTypeDataContractResolver.cs @@ -3,6 +3,7 @@ using System.Xml; using System.Reflection; +using System.Diagnostics.CodeAnalysis; namespace System.Runtime.Serialization { @@ -16,6 +17,7 @@ internal KnownTypeDataContractResolver(XmlObjectSerializerContext context) _context = context; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override bool TryResolveType(Type type, Type? declaredType, DataContractResolver knownTypeResolver, out XmlDictionaryString? typeName, out XmlDictionaryString? typeNamespace) { if (type == null) @@ -46,6 +48,7 @@ public override bool TryResolveType(Type type, Type? declaredType, DataContractR } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override Type? ResolveName(string typeName, string? typeNamespace, Type? declaredType, DataContractResolver knownTypeResolver) { if (typeName == null || typeNamespace == null) diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/PrimitiveDataContract.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/PrimitiveDataContract.cs index 4ca4a4717a3ad2..8793954253a002 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/PrimitiveDataContract.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/PrimitiveDataContract.cs @@ -4,6 +4,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Reflection; using System.Xml; @@ -16,16 +17,20 @@ internal abstract class PrimitiveDataContract : DataContract private readonly PrimitiveDataContractCriticalHelper _helper; - protected PrimitiveDataContract(Type type, XmlDictionaryString name, XmlDictionaryString ns) : base(new PrimitiveDataContractCriticalHelper(type, name, ns)) + protected PrimitiveDataContract( + [DynamicallyAccessedMembers(ClassDataContract.DataContractPreserveMemberTypes)] + Type type, XmlDictionaryString name, XmlDictionaryString ns) : base(new PrimitiveDataContractCriticalHelper(type, name, ns)) { _helper = (base.Helper as PrimitiveDataContractCriticalHelper)!; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static PrimitiveDataContract? GetPrimitiveDataContract(Type type) { return DataContract.GetBuiltInDataContract(type) as PrimitiveDataContract; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static PrimitiveDataContract? GetPrimitiveDataContract(string name, string ns) { return DataContract.GetBuiltInDataContract(name, ns) as PrimitiveDataContract; @@ -51,6 +56,7 @@ public override XmlDictionaryString? TopLevelElementNamespace internal MethodInfo XmlFormatWriterMethod { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (_helper.XmlFormatWriterMethod == null) @@ -66,6 +72,7 @@ internal MethodInfo XmlFormatWriterMethod internal MethodInfo XmlFormatContentWriterMethod { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (_helper.XmlFormatContentWriterMethod == null) @@ -91,6 +98,7 @@ internal MethodInfo XmlFormatReaderMethod } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator xmlWriter, object obj, XmlObjectSerializerWriteContext? context) { xmlWriter.WriteAnyType(obj); @@ -122,7 +130,10 @@ private sealed class PrimitiveDataContractCriticalHelper : DataContract.DataCont private MethodInfo? _xmlFormatContentWriterMethod; private MethodInfo? _xmlFormatReaderMethod; - internal PrimitiveDataContractCriticalHelper(Type type, XmlDictionaryString name, XmlDictionaryString ns) : base(type) + internal PrimitiveDataContractCriticalHelper( + [DynamicallyAccessedMembers(ClassDataContract.DataContractPreserveMemberTypes)] + Type type, + XmlDictionaryString name, XmlDictionaryString ns) : base(type) { SetDataContractName(name, ns); } @@ -160,17 +171,20 @@ internal CharDataContract(XmlDictionaryString name, XmlDictionaryString ns) : ba internal override string WriteMethodName { get { return "WriteChar"; } } internal override string ReadMethodName { get { return "ReadElementContentAsChar"; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext? context) { writer.WriteChar((char)obj); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext? context) { return (context == null) ? reader.ReadElementContentAsChar() : HandleReadValue(reader.ReadElementContentAsChar(), context); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlElement(XmlWriterDelegator xmlWriter, object? obj, XmlObjectSerializerWriteContext context, XmlDictionaryString name, XmlDictionaryString? ns) { xmlWriter.WriteChar((char)obj!, name, ns); @@ -191,17 +205,20 @@ public BooleanDataContract() : base(typeof(bool), DictionaryGlobals.BooleanLocal internal override string WriteMethodName { get { return "WriteBoolean"; } } internal override string ReadMethodName { get { return "ReadElementContentAsBoolean"; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext? context) { writer.WriteBoolean((bool)obj); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext? context) { return (context == null) ? reader.ReadElementContentAsBoolean() : HandleReadValue(reader.ReadElementContentAsBoolean(), context); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlElement(XmlWriterDelegator xmlWriter, object? obj, XmlObjectSerializerWriteContext context, XmlDictionaryString name, XmlDictionaryString? ns) { xmlWriter.WriteBoolean((bool)obj!, name, ns); @@ -217,17 +234,20 @@ public SignedByteDataContract() : base(typeof(sbyte), DictionaryGlobals.SignedBy internal override string WriteMethodName { get { return "WriteSignedByte"; } } internal override string ReadMethodName { get { return "ReadElementContentAsSignedByte"; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext? context) { writer.WriteSignedByte((sbyte)obj); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext? context) { return (context == null) ? reader.ReadElementContentAsSignedByte() : HandleReadValue(reader.ReadElementContentAsSignedByte(), context); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlElement(XmlWriterDelegator xmlWriter, object? obj, XmlObjectSerializerWriteContext context, XmlDictionaryString name, XmlDictionaryString? ns) { xmlWriter.WriteSignedByte((sbyte)obj!, name, ns); @@ -243,17 +263,20 @@ public UnsignedByteDataContract() : base(typeof(byte), DictionaryGlobals.Unsigne internal override string WriteMethodName { get { return "WriteUnsignedByte"; } } internal override string ReadMethodName { get { return "ReadElementContentAsUnsignedByte"; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext? context) { writer.WriteUnsignedByte((byte)obj); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext? context) { return (context == null) ? reader.ReadElementContentAsUnsignedByte() : HandleReadValue(reader.ReadElementContentAsUnsignedByte(), context); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlElement(XmlWriterDelegator xmlWriter, object? obj, XmlObjectSerializerWriteContext context, XmlDictionaryString name, XmlDictionaryString? ns) { xmlWriter.WriteUnsignedByte((byte)obj!, name, ns); @@ -269,17 +292,20 @@ public ShortDataContract() : base(typeof(short), DictionaryGlobals.ShortLocalNam internal override string WriteMethodName { get { return "WriteShort"; } } internal override string ReadMethodName { get { return "ReadElementContentAsShort"; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext? context) { writer.WriteShort((short)obj); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext? context) { return (context == null) ? reader.ReadElementContentAsShort() : HandleReadValue(reader.ReadElementContentAsShort(), context); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlElement(XmlWriterDelegator xmlWriter, object? obj, XmlObjectSerializerWriteContext context, XmlDictionaryString name, XmlDictionaryString? ns) { xmlWriter.WriteShort((short)obj!, name, ns); @@ -295,17 +321,20 @@ public UnsignedShortDataContract() : base(typeof(ushort), DictionaryGlobals.Unsi internal override string WriteMethodName { get { return "WriteUnsignedShort"; } } internal override string ReadMethodName { get { return "ReadElementContentAsUnsignedShort"; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext? context) { writer.WriteUnsignedShort((ushort)obj); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext? context) { return (context == null) ? reader.ReadElementContentAsUnsignedShort() : HandleReadValue(reader.ReadElementContentAsUnsignedShort(), context); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlElement(XmlWriterDelegator xmlWriter, object? obj, XmlObjectSerializerWriteContext context, XmlDictionaryString name, XmlDictionaryString? ns) { xmlWriter.WriteUnsignedShort((ushort)obj!, name, ns); @@ -314,6 +343,9 @@ public override void WriteXmlElement(XmlWriterDelegator xmlWriter, object? obj, internal sealed class NullPrimitiveDataContract : PrimitiveDataContract { + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", + Justification = "This warns because the call to Base has the type annotated with DynamicallyAccessedMembers so it warns" + + "when looking into the methods of NullPrimitiveDataContract. Because this just represents null, we suppress.")] public NullPrimitiveDataContract() : base(typeof(NullPrimitiveDataContract), DictionaryGlobals.EmptyString, DictionaryGlobals.EmptyString) { @@ -335,16 +367,19 @@ internal override string WriteMethodName } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext? context) { throw new NotImplementedException(); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext? context) { throw new NotImplementedException(); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlElement(XmlWriterDelegator xmlWriter, object? obj, XmlObjectSerializerWriteContext context, XmlDictionaryString name, XmlDictionaryString? ns) { throw new NotImplementedException(); @@ -360,17 +395,20 @@ public IntDataContract() : base(typeof(int), DictionaryGlobals.IntLocalName, Dic internal override string WriteMethodName { get { return "WriteInt"; } } internal override string ReadMethodName { get { return "ReadElementContentAsInt"; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext? context) { writer.WriteInt((int)obj); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext? context) { return (context == null) ? reader.ReadElementContentAsInt() : HandleReadValue(reader.ReadElementContentAsInt(), context); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlElement(XmlWriterDelegator xmlWriter, object? obj, XmlObjectSerializerWriteContext context, XmlDictionaryString name, XmlDictionaryString? ns) { xmlWriter.WriteInt((int)obj!, name, ns); @@ -386,17 +424,20 @@ public UnsignedIntDataContract() : base(typeof(uint), DictionaryGlobals.Unsigned internal override string WriteMethodName { get { return "WriteUnsignedInt"; } } internal override string ReadMethodName { get { return "ReadElementContentAsUnsignedInt"; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext? context) { writer.WriteUnsignedInt((uint)obj); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext? context) { return (context == null) ? reader.ReadElementContentAsUnsignedInt() : HandleReadValue(reader.ReadElementContentAsUnsignedInt(), context); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlElement(XmlWriterDelegator xmlWriter, object? obj, XmlObjectSerializerWriteContext context, XmlDictionaryString name, XmlDictionaryString? ns) { xmlWriter.WriteUnsignedInt((uint)obj!, name, ns); @@ -416,17 +457,20 @@ internal LongDataContract(XmlDictionaryString name, XmlDictionaryString ns) : ba internal override string WriteMethodName { get { return "WriteLong"; } } internal override string ReadMethodName { get { return "ReadElementContentAsLong"; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext? context) { writer.WriteLong((long)obj); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext? context) { return (context == null) ? reader.ReadElementContentAsLong() : HandleReadValue(reader.ReadElementContentAsLong(), context); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlElement(XmlWriterDelegator xmlWriter, object? obj, XmlObjectSerializerWriteContext context, XmlDictionaryString name, XmlDictionaryString? ns) { xmlWriter.WriteLong((long)obj!, name, ns); @@ -467,17 +511,20 @@ public UnsignedLongDataContract() : base(typeof(ulong), DictionaryGlobals.Unsign internal override string WriteMethodName { get { return "WriteUnsignedLong"; } } internal override string ReadMethodName { get { return "ReadElementContentAsUnsignedLong"; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext? context) { writer.WriteUnsignedLong((ulong)obj); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext? context) { return (context == null) ? reader.ReadElementContentAsUnsignedLong() : HandleReadValue(reader.ReadElementContentAsUnsignedLong(), context); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlElement(XmlWriterDelegator xmlWriter, object? obj, XmlObjectSerializerWriteContext context, XmlDictionaryString name, XmlDictionaryString? ns) { xmlWriter.WriteUnsignedLong((ulong)obj!, name, ns); @@ -493,17 +540,20 @@ public FloatDataContract() : base(typeof(float), DictionaryGlobals.FloatLocalNam internal override string WriteMethodName { get { return "WriteFloat"; } } internal override string ReadMethodName { get { return "ReadElementContentAsFloat"; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext? context) { writer.WriteFloat((float)obj); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext? context) { return (context == null) ? reader.ReadElementContentAsFloat() : HandleReadValue(reader.ReadElementContentAsFloat(), context); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlElement(XmlWriterDelegator xmlWriter, object? obj, XmlObjectSerializerWriteContext context, XmlDictionaryString name, XmlDictionaryString? ns) { xmlWriter.WriteFloat((float)obj!, name, ns); @@ -519,17 +569,20 @@ public DoubleDataContract() : base(typeof(double), DictionaryGlobals.DoubleLocal internal override string WriteMethodName { get { return "WriteDouble"; } } internal override string ReadMethodName { get { return "ReadElementContentAsDouble"; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext? context) { writer.WriteDouble((double)obj); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext? context) { return (context == null) ? reader.ReadElementContentAsDouble() : HandleReadValue(reader.ReadElementContentAsDouble(), context); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlElement(XmlWriterDelegator xmlWriter, object? obj, XmlObjectSerializerWriteContext context, XmlDictionaryString name, XmlDictionaryString? ns) { xmlWriter.WriteDouble((double)obj!, name, ns); @@ -545,17 +598,20 @@ public DecimalDataContract() : base(typeof(decimal), DictionaryGlobals.DecimalLo internal override string WriteMethodName { get { return "WriteDecimal"; } } internal override string ReadMethodName { get { return "ReadElementContentAsDecimal"; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext? context) { writer.WriteDecimal((decimal)obj); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext? context) { return (context == null) ? reader.ReadElementContentAsDecimal() : HandleReadValue(reader.ReadElementContentAsDecimal(), context); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlElement(XmlWriterDelegator xmlWriter, object? obj, XmlObjectSerializerWriteContext context, XmlDictionaryString name, XmlDictionaryString? ns) { xmlWriter.WriteDecimal((decimal)obj!, name, ns); @@ -571,17 +627,20 @@ public DateTimeDataContract() : base(typeof(DateTime), DictionaryGlobals.DateTim internal override string WriteMethodName { get { return "WriteDateTime"; } } internal override string ReadMethodName { get { return "ReadElementContentAsDateTime"; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext? context) { writer.WriteDateTime((DateTime)obj); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext? context) { return (context == null) ? reader.ReadElementContentAsDateTime() : HandleReadValue(reader.ReadElementContentAsDateTime(), context); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlElement(XmlWriterDelegator xmlWriter, object? obj, XmlObjectSerializerWriteContext context, XmlDictionaryString name, XmlDictionaryString? ns) { xmlWriter.WriteDateTime((DateTime)obj!, name, ns); @@ -601,11 +660,13 @@ internal StringDataContract(XmlDictionaryString name, XmlDictionaryString ns) : internal override string WriteMethodName { get { return "WriteString"; } } internal override string ReadMethodName { get { return "ReadElementContentAsString"; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext? context) { writer.WriteString((string)obj); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext? context) { if (context == null) @@ -618,6 +679,7 @@ public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObj } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlElement(XmlWriterDelegator xmlWriter, object? obj, XmlObjectSerializerWriteContext context, XmlDictionaryString name, XmlDictionaryString? ns) { context.WriteString(xmlWriter, (string?)obj, name, ns); @@ -733,11 +795,13 @@ public ByteArrayDataContract() : base(typeof(byte[]), DictionaryGlobals.ByteArra internal override string WriteMethodName { get { return "WriteBase64"; } } internal override string ReadMethodName { get { return "ReadElementContentAsBase64"; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext? context) { writer.WriteBase64((byte[])obj); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext? context) { if (context == null) @@ -750,6 +814,7 @@ public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObj } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlElement(XmlWriterDelegator xmlWriter, object? obj, XmlObjectSerializerWriteContext context, XmlDictionaryString name, XmlDictionaryString? ns) { xmlWriter.WriteStartElement(name, ns); @@ -767,11 +832,13 @@ public ObjectDataContract() : base(typeof(object), DictionaryGlobals.ObjectLocal internal override string WriteMethodName { get { return "WriteAnyType"; } } internal override string ReadMethodName { get { return "ReadElementContentAsAnyType"; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext? context) { // write nothing } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext? context) { object obj; @@ -822,17 +889,20 @@ internal TimeSpanDataContract(XmlDictionaryString name, XmlDictionaryString ns) internal override string WriteMethodName { get { return "WriteTimeSpan"; } } internal override string ReadMethodName { get { return "ReadElementContentAsTimeSpan"; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext? context) { writer.WriteTimeSpan((TimeSpan)obj); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext? context) { return (context == null) ? reader.ReadElementContentAsTimeSpan() : HandleReadValue(reader.ReadElementContentAsTimeSpan(), context); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlElement(XmlWriterDelegator writer, object? obj, XmlObjectSerializerWriteContext context, XmlDictionaryString name, XmlDictionaryString? ns) { writer.WriteTimeSpan((TimeSpan)obj!, name, ns); @@ -857,17 +927,20 @@ internal GuidDataContract(XmlDictionaryString name, XmlDictionaryString ns) : ba internal override string WriteMethodName { get { return "WriteGuid"; } } internal override string ReadMethodName { get { return "ReadElementContentAsGuid"; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext? context) { writer.WriteGuid((Guid)obj); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext? context) { return (context == null) ? reader.ReadElementContentAsGuid() : HandleReadValue(reader.ReadElementContentAsGuid(), context); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlElement(XmlWriterDelegator xmlWriter, object? obj, XmlObjectSerializerWriteContext context, XmlDictionaryString name, XmlDictionaryString? ns) { xmlWriter.WriteGuid((Guid)obj!, name, ns); @@ -888,11 +961,13 @@ public UriDataContract() : base(typeof(Uri), DictionaryGlobals.UriLocalName, Dic internal override string WriteMethodName { get { return "WriteUri"; } } internal override string ReadMethodName { get { return "ReadElementContentAsUri"; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext? context) { writer.WriteUri((Uri)obj); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext? context) { if (context == null) @@ -905,6 +980,7 @@ public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObj } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlElement(XmlWriterDelegator writer, object? obj, XmlObjectSerializerWriteContext context, XmlDictionaryString name, XmlDictionaryString? ns) { writer.WriteUri((Uri?)obj, name, ns); @@ -925,11 +1001,13 @@ internal override bool IsPrimitive get { return false; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObjectSerializerWriteContext? context) { writer.WriteQName((XmlQualifiedName)obj); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadXmlValue(XmlReaderDelegator reader, XmlObjectSerializerReadContext? context) { if (context == null) @@ -942,6 +1020,7 @@ public override void WriteXmlValue(XmlWriterDelegator writer, object obj, XmlObj } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlElement(XmlWriterDelegator writer, object? obj, XmlObjectSerializerWriteContext context, XmlDictionaryString name, XmlDictionaryString? ns) { context.WriteQName(writer, (XmlQualifiedName?)obj, name, ns); diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ReflectionClassWriter.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ReflectionClassWriter.cs index 4b0f10bd2cfc0e..c8f5f5829d27be 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ReflectionClassWriter.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ReflectionClassWriter.cs @@ -5,9 +5,9 @@ using System.Collections; using System.Collections.Generic; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Reflection; -using System.Runtime.Serialization.Json; using System.Text; using System.Threading.Tasks; using System.Xml; @@ -16,6 +16,7 @@ namespace System.Runtime.Serialization { internal abstract class ReflectionClassWriter { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public void ReflectionWriteClass(XmlWriterDelegator xmlWriter, object obj, XmlObjectSerializerWriteContext context, ClassDataContract classContract, XmlDictionaryString[]? memberNames) { InvokeOnSerializing(obj, context, classContract); @@ -37,6 +38,7 @@ public void ReflectionWriteClass(XmlWriterDelegator xmlWriter, object obj, XmlOb InvokeOnSerialized(obj, context, classContract); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public void ReflectionWriteValue(XmlWriterDelegator xmlWriter, XmlObjectSerializerWriteContext context, Type type, object? value, bool writeXsiType, PrimitiveDataContract? primitiveContractForParamType) { Type memberType = type; @@ -100,6 +102,7 @@ public void ReflectionWriteValue(XmlWriterDelegator xmlWriter, XmlObjectSerializ } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected abstract int ReflectionWriteMembers(XmlWriterDelegator xmlWriter, object obj, XmlObjectSerializerWriteContext context, ClassDataContract classContract, ClassDataContract derivedMostClassContract, int childElementIndex, XmlDictionaryString[]? memberNames); protected object? ReflectionGetMemberValue(object obj, DataMember dataMember) @@ -107,6 +110,7 @@ public void ReflectionWriteValue(XmlWriterDelegator xmlWriter, XmlObjectSerializ return dataMember.Getter(obj); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected bool ReflectionTryWritePrimitive(XmlWriterDelegator xmlWriter, XmlObjectSerializerWriteContext context, Type type, object? value, XmlDictionaryString name, XmlDictionaryString? ns, PrimitiveDataContract? primitiveContract) { if (primitiveContract == null || primitiveContract.UnderlyingType == Globals.TypeOfObject) @@ -154,6 +158,7 @@ private object ResolveAdapterType(object obj, ClassDataContract classContract) return obj; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void ReflectionInternalSerialize(XmlWriterDelegator xmlWriter, XmlObjectSerializerWriteContext context, object obj, bool isDeclaredType, bool writeXsiType, Type memberType, bool isNullableOfT = false) { if (isNullableOfT) diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ReflectionReader.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ReflectionReader.cs index 2b7103688045c0..f6681798f741e4 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ReflectionReader.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ReflectionReader.cs @@ -8,7 +8,6 @@ using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Reflection; -using System.Runtime.Serialization.Json; using System.Text; using System.Threading.Tasks; using System.Xml; @@ -20,13 +19,26 @@ internal abstract class ReflectionReader private delegate object? CollectionReadItemDelegate(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, CollectionDataContract collectionContract, Type itemType, string itemName, string itemNs); private delegate object CollectionSetItemDelegate(object resultCollection, object? collectionItem, int itemIndex); - private static readonly MethodInfo s_getCollectionSetItemDelegateMethod = typeof(ReflectionReader).GetMethod(nameof(GetCollectionSetItemDelegate), BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance)!; + private static MethodInfo? s_getCollectionSetItemDelegateMethod; private static readonly MethodInfo s_objectToKeyValuePairGetKey = typeof(ReflectionReader).GetMethod(nameof(ObjectToKeyValuePairGetKey), BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static)!; private static readonly MethodInfo s_objectToKeyValuePairGetValue = typeof(ReflectionReader).GetMethod(nameof(ObjectToKeyValuePairGetValue), BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static)!; private static readonly Type[] s_arrayConstructorParameters = new Type[] { Globals.TypeOfInt }; private static readonly object[] s_arrayConstructorArguments = new object[] { 32 }; + private static MethodInfo CollectionSetItemDelegateMethod + { + get + { + if (s_getCollectionSetItemDelegateMethod == null) + { + s_getCollectionSetItemDelegateMethod = typeof(ReflectionReader).GetMethod(nameof(GetCollectionSetItemDelegate), BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance)!; + } + return s_getCollectionSetItemDelegateMethod!; + } + } + + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public object ReflectionReadClass(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext? context, XmlDictionaryString[]? memberNames, XmlDictionaryString[]? memberNamespaces, ClassDataContract classContract) { Debug.Assert(context != null); @@ -57,6 +69,7 @@ public object ReflectionReadClass(XmlReaderDelegator xmlReader, XmlObjectSeriali return obj; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public void ReflectionReadGetOnlyCollection(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, XmlDictionaryString collectionItemName, XmlDictionaryString collectionItemNamespace, CollectionDataContract collectionContract) { object? resultCollection = context.GetCollectionMember(); @@ -78,11 +91,13 @@ public void ReflectionReadGetOnlyCollection(XmlReaderDelegator xmlReader, XmlObj } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public object ReflectionReadCollection(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, XmlDictionaryString collectionItemName, XmlDictionaryString collectionItemNamespace, CollectionDataContract collectionContract) { return ReflectionReadCollectionCore(xmlReader, context, collectionItemName, collectionItemNamespace, collectionContract); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private object ReflectionReadCollectionCore(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, XmlDictionaryString collectionItemName, XmlDictionaryString collectionItemNamespace, CollectionDataContract collectionContract) { bool isArray = (collectionContract.Kind == CollectionKind.Array); @@ -107,15 +122,13 @@ private object ReflectionReadCollectionCore(XmlReaderDelegator xmlReader, XmlObj return resultCollection; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private CollectionReadItemDelegate GetCollectionReadItemDelegate(CollectionDataContract collectionContract) { CollectionReadItemDelegate collectionReadItemDelegate; if (collectionContract.Kind == CollectionKind.Dictionary || collectionContract.Kind == CollectionKind.GenericDictionary) { - collectionReadItemDelegate = (xmlReaderArg, contextArg, collectionContractArg, itemTypeArg, itemNameArg, itemNsArg) => - { - return ReflectionReadDictionaryItem(xmlReaderArg, contextArg, collectionContractArg); - }; + collectionReadItemDelegate = GetReadDictionaryItemDelegate; } else { @@ -123,15 +136,22 @@ private CollectionReadItemDelegate GetCollectionReadItemDelegate(CollectionDataC } return collectionReadItemDelegate; + + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] + object? GetReadDictionaryItemDelegate(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, CollectionDataContract collectionContract, Type itemType, string itemName, string itemNs) + { + return ReflectionReadDictionaryItem(xmlReader, context, collectionContract); + }; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private object ReadCollectionItems(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, XmlDictionaryString collectionItemName, XmlDictionaryString collectionItemNamespace, CollectionDataContract collectionContract, object resultCollection, bool isReadOnlyCollection) { string itemName = GetCollectionContractItemName(collectionContract); string itemNs = GetCollectionContractNamespace(collectionContract); Type itemType = collectionContract.ItemType; CollectionReadItemDelegate collectionReadItemDelegate = GetCollectionReadItemDelegate(collectionContract); - MethodInfo getCollectionSetItemDelegateMethod = s_getCollectionSetItemDelegateMethod.MakeGenericMethod(itemType); + MethodInfo getCollectionSetItemDelegateMethod = CollectionSetItemDelegateMethod.MakeGenericMethod(itemType); CollectionSetItemDelegate collectionSetItemDelegate = (CollectionSetItemDelegate)getCollectionSetItemDelegateMethod.Invoke(this, new object[] { collectionContract, resultCollection, isReadOnlyCollection })!; int index = 0; @@ -170,12 +190,15 @@ private object ReadCollectionItems(XmlReaderDelegator xmlReader, XmlObjectSerial return resultCollection; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected abstract void ReflectionReadMembers(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, XmlDictionaryString[] memberNames, XmlDictionaryString[]? memberNamespaces, ClassDataContract classContract, ref object obj); + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected abstract object? ReflectionReadDictionaryItem(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, CollectionDataContract collectionContract); protected abstract string GetCollectionContractItemName(CollectionDataContract collectionContract); protected abstract string GetCollectionContractNamespace(CollectionDataContract collectionContract); protected abstract string GetClassContractNamespace(ClassDataContract classContract); + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected virtual bool ReflectionReadSpecialCollection(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, CollectionDataContract collectionContract, object? resultCollection) { return false; @@ -193,6 +216,7 @@ protected int ReflectionGetMembers(ClassDataContract classContract, DataMember[] return memberCount; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected void ReflectionReadMember(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, ClassDataContract classContract, ref object obj, int memberIndex, DataMember[] members) { DataMember dataMember = members[memberIndex]; @@ -215,6 +239,7 @@ protected void ReflectionReadMember(XmlReaderDelegator xmlReader, XmlObjectSeria } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected object? ReflectionReadValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, Type type, string name, string ns, PrimitiveDataContract? primitiveContractForOriginalType = null) { object? value = null; @@ -241,6 +266,7 @@ protected void ReflectionReadMember(XmlReaderDelegator xmlReader, XmlObjectSeria return value; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private object? ReadItemOfPrimitiveType(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, Type type, string name, string ns, PrimitiveDataContract? primitiveContract, int nullables) { object? value; @@ -294,6 +320,7 @@ protected void ReflectionReadMember(XmlReaderDelegator xmlReader, XmlObjectSeria return value; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private static object ReadISerializable(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, ClassDataContract classContract) { object obj; @@ -305,6 +332,7 @@ private static object ReadISerializable(XmlReaderDelegator xmlReader, XmlObjectS } // This method is a perf optimization for collections. The original method is ReflectionReadValue. + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private CollectionReadItemDelegate GetReflectionReadValueDelegate(Type type) { int nullables = 0; @@ -317,15 +345,18 @@ private CollectionReadItemDelegate GetReflectionReadValueDelegate(Type type) PrimitiveDataContract? primitiveContract = PrimitiveDataContract.GetPrimitiveDataContract(type); if ((primitiveContract != null && primitiveContract.UnderlyingType != Globals.TypeOfObject) || nullables != 0 || type.IsValueType) { - return (xmlReaderArg, contextArg, collectionContract, typeArg, nameArg, nsArg) => - { - return ReadItemOfPrimitiveType(xmlReaderArg, contextArg, typeArg, nameArg, nsArg, primitiveContract, nullables); - }; + return GetReadItemOfPrimitiveTypeDelegate; } else { return ReflectionInternalDeserialize; } + + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] + object? GetReadItemOfPrimitiveTypeDelegate(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, CollectionDataContract collectionContract, Type itemType, string itemName, string itemNs) + { + return ReadItemOfPrimitiveType(xmlReader, context, itemType, itemName, itemNs, primitiveContract, nullables); + }; } private object? ReflectionGetMemberValue(object obj, DataMember dataMember) @@ -338,6 +369,7 @@ private void ReflectionSetMemberValue(ref object obj, object? memberValue, DataM dataMember.Setter(ref obj, memberValue); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private object? ReflectionReadValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, DataMember dataMember, string ns) { Type type = dataMember.MemberType; @@ -346,6 +378,7 @@ private void ReflectionSetMemberValue(ref object obj, object? memberValue, DataM return ReflectionReadValue(xmlReader, context, type, name, ns, dataMember.MemberPrimitiveContract); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] 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); @@ -429,6 +462,7 @@ private bool IsArrayLikeCollection(CollectionDataContract collectionContract) return collectionContract.Kind == CollectionKind.Array || IsArrayLikeInterface(collectionContract); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private object ReflectionCreateCollection(CollectionDataContract collectionContract) { if (IsArrayLikeCollection(collectionContract)) @@ -505,8 +539,8 @@ private CollectionSetItemDelegate GetCollectionSetItemDelegate(CollectionData { Type keyType = collectionContract.ItemType.GenericTypeArguments[0]; Type valueType = collectionContract.ItemType.GenericTypeArguments[1]; - Func objectToKeyValuePairGetKey = s_objectToKeyValuePairGetKey.MakeGenericMethod(keyType, valueType).CreateDelegate>(); - Func objectToKeyValuePairGetValue = s_objectToKeyValuePairGetValue.MakeGenericMethod(keyType, valueType).CreateDelegate>(); + Func objectToKeyValuePairGetKey = MakeGenericMethod(s_objectToKeyValuePairGetKey, keyType, valueType).CreateDelegate>(); + Func objectToKeyValuePairGetValue = MakeGenericMethod(s_objectToKeyValuePairGetValue, keyType, valueType).CreateDelegate>(); if (collectionContract.Kind == CollectionKind.GenericDictionary) { @@ -568,8 +602,13 @@ private CollectionSetItemDelegate GetCollectionSetItemDelegate(CollectionData }; } } + + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2060:MakeGenericMethod", + Justification = "The call to MakeGenericMethod is safe due to the fact that ObjectToKeyValuePairGetKey and ObjectToKeyValuePairGetValue are not annotated.")] + static MethodInfo MakeGenericMethod(MethodInfo method, Type keyType, Type valueType) => method.MakeGenericMethod(keyType, valueType); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private bool ReflectionTryReadPrimitiveArray(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, XmlDictionaryString collectionItemName, XmlDictionaryString collectionItemNamespace, Type type, Type itemType, int arraySize, [NotNullWhen(true)] out object? resultArray) { resultArray = null; diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ReflectionXmlFormatReader.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ReflectionXmlFormatReader.cs index 9c45733bb2b4ec..98e3c1ea9a4ff0 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ReflectionXmlFormatReader.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ReflectionXmlFormatReader.cs @@ -10,6 +10,7 @@ using System.Collections.Generic; using System.Security; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; namespace System.Runtime.Serialization { @@ -25,6 +26,7 @@ public ReflectionXmlClassReader(ClassDataContract classDataContract) _reflectionReader = new ReflectionXmlReader(); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public object ReflectionReadClass(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext? context, XmlDictionaryString[]? memberNames, XmlDictionaryString[]? memberNamespaces) { return _reflectionReader.ReflectionReadClass(xmlReader, context, memberNames, memberNamespaces, _classContract); @@ -35,11 +37,13 @@ internal sealed class ReflectionXmlCollectionReader { private readonly ReflectionReader _reflectionReader = new ReflectionXmlReader(); + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public object ReflectionReadCollection(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, XmlDictionaryString itemName, XmlDictionaryString itemNamespace, CollectionDataContract collectionContract) { return _reflectionReader.ReflectionReadCollection(xmlReader, context, itemName, itemNamespace/*itemNamespace*/, collectionContract); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public void ReflectionReadGetOnlyCollection(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, XmlDictionaryString itemName, XmlDictionaryString itemNs, CollectionDataContract collectionContract) { _reflectionReader.ReflectionReadGetOnlyCollection(xmlReader, context, itemName, itemNs, collectionContract); @@ -48,6 +52,7 @@ public void ReflectionReadGetOnlyCollection(XmlReaderDelegator xmlReader, XmlObj internal sealed class ReflectionXmlReader : ReflectionReader { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected override void ReflectionReadMembers(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, XmlDictionaryString[] memberNames, XmlDictionaryString[]? memberNamespaces, ClassDataContract classContract, ref object obj) { Debug.Assert(memberNamespaces != null); @@ -109,6 +114,7 @@ protected override string GetCollectionContractNamespace(CollectionDataContract return collectionContract.StableName.Namespace; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected override object? ReflectionReadDictionaryItem(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context, CollectionDataContract collectionContract) { Debug.Assert(collectionContract.Kind == CollectionKind.Dictionary || collectionContract.Kind == CollectionKind.GenericDictionary); diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ReflectionXmlFormatWriter.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ReflectionXmlFormatWriter.cs index 1e53b9f8bae61e..db84e5793c4d29 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ReflectionXmlFormatWriter.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ReflectionXmlFormatWriter.cs @@ -4,6 +4,7 @@ using System.Collections; using System.Collections.Generic; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Reflection; using System.Reflection.Emit; using System.Xml; @@ -14,11 +15,13 @@ internal sealed class ReflectionXmlFormatWriter { private readonly ReflectionXmlClassWriter _reflectionClassWriter = new ReflectionXmlClassWriter(); + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public void ReflectionWriteClass(XmlWriterDelegator xmlWriter, object obj, XmlObjectSerializerWriteContext context, ClassDataContract classContract) { _reflectionClassWriter.ReflectionWriteClass(xmlWriter, obj, context, classContract, null/*memberNames*/); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public void ReflectionWriteCollection(XmlWriterDelegator xmlWriter, object obj, XmlObjectSerializerWriteContext context, CollectionDataContract collectionDataContract) { XmlDictionaryString ns = collectionDataContract.Namespace; @@ -85,6 +88,7 @@ public void ReflectionWriteCollection(XmlWriterDelegator xmlWriter, object obj, } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private bool ReflectionTryWritePrimitiveArray(XmlWriterDelegator xmlWriter, object obj, Type type, Type itemType, XmlDictionaryString collectionItemName, XmlDictionaryString itemNamespace) { PrimitiveDataContract? primitiveContract = PrimitiveDataContract.GetPrimitiveDataContract(itemType); @@ -124,6 +128,7 @@ private bool ReflectionTryWritePrimitiveArray(XmlWriterDelegator xmlWriter, obje internal sealed class ReflectionXmlClassWriter : ReflectionClassWriter { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected override int ReflectionWriteMembers(XmlWriterDelegator xmlWriter, object obj, XmlObjectSerializerWriteContext context, ClassDataContract classContract, ClassDataContract derivedMostClassContract, int childElementIndex, XmlDictionaryString[]? emptyStringArray) { int memberCount = (classContract.BaseContract == null) ? 0 : diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/SchemaExporter.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/SchemaExporter.cs index c6d6daf0f49918..48dccee71f7bad 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/SchemaExporter.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/SchemaExporter.cs @@ -43,6 +43,7 @@ private XmlDocument XmlDoc } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal void Export() { try @@ -78,6 +79,7 @@ private void ExportSerializationSchema() } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void ExportDataContract(DataContract dataContract) { if (dataContract.IsBuiltInDataContract) @@ -118,6 +120,7 @@ private XmlSchemaElement ExportTopLevelElement(DataContract dataContract, XmlSch return topLevelElement; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void ExportClassDataContract(ClassDataContract classDataContract, XmlSchema schema) { XmlSchemaComplexType type = new XmlSchemaComplexType(); @@ -248,6 +251,7 @@ private static XmlElement ExportActualType(XmlQualifiedName typeName, XmlDocumen return actualTypeElement; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private XmlElement ExportGenericInfo(Type clrType, string elementName, string elementNs) { Type? itemType; @@ -340,6 +344,7 @@ private XmlElement ExportGenericInfo(Type clrType, string elementName, string el return null; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void ExportCollectionDataContract(CollectionDataContract collectionDataContract, XmlSchema schema) { XmlSchemaComplexType type = new XmlSchemaComplexType(); @@ -441,6 +446,7 @@ internal static long GetDefaultEnumValue(bool isFlags, int index) return isFlags ? (long)Math.Pow(2, index) : index; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void ExportISerializableDataContract(ClassDataContract dataContract, XmlSchema schema) { XmlSchemaComplexType type = new XmlSchemaComplexType(); @@ -480,6 +486,7 @@ private XmlSchemaComplexContentExtension CreateTypeContent(XmlSchemaComplexType return extension; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void ExportXmlDataContract(XmlDataContract dataContract) { XmlQualifiedName? typeQName; @@ -566,6 +573,7 @@ private static void ReprocessAll(XmlSchemaSet schemas)// and remove duplicate it } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static void GetXmlTypeInfo(Type type, out XmlQualifiedName stableName, out XmlSchemaType? xsdType, out bool hasRoot) { if (IsSpecialXmlType(type, out stableName!, out xsdType, out hasRoot)) @@ -577,6 +585,7 @@ internal static void GetXmlTypeInfo(Type type, out XmlQualifiedName stableName, throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.Format(SR.InvalidXmlDataContractName, DataContract.GetClrTypeFullName(type)))); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private static bool InvokeSchemaProviderMethod(Type clrType, XmlSchemaSet schemas, out XmlQualifiedName stableName, out XmlSchemaType? xsdType, out bool hasRoot) { xsdType = null; @@ -667,7 +676,10 @@ private static bool InvokeSchemaProviderMethod(Type clrType, XmlSchemaSet schema return true; } - private static void InvokeGetSchemaMethod(Type clrType, XmlSchemaSet schemas, XmlQualifiedName stableName) + private static void InvokeGetSchemaMethod( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] + Type clrType, + XmlSchemaSet schemas, XmlQualifiedName stableName) { IXmlSerializable ixmlSerializable = (IXmlSerializable)Activator.CreateInstance(clrType)!; XmlSchema? schema = ixmlSerializable.GetSchema(); diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/SpecialTypeDataContract.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/SpecialTypeDataContract.cs index 38022467d2b6c7..010871e02e13ab 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/SpecialTypeDataContract.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/SpecialTypeDataContract.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Diagnostics.CodeAnalysis; using System.Xml; namespace System.Runtime.Serialization @@ -9,7 +10,10 @@ internal sealed class SpecialTypeDataContract : DataContract { private readonly SpecialTypeDataContractCriticalHelper _helper; - public SpecialTypeDataContract(Type type, XmlDictionaryString name, XmlDictionaryString ns) : base(new SpecialTypeDataContractCriticalHelper(type, name, ns)) + public SpecialTypeDataContract( + [DynamicallyAccessedMembers(ClassDataContract.DataContractPreserveMemberTypes)] + Type type, + XmlDictionaryString name, XmlDictionaryString ns) : base(new SpecialTypeDataContractCriticalHelper(type, name, ns)) { _helper = (base.Helper as SpecialTypeDataContractCriticalHelper)!; } @@ -18,7 +22,10 @@ public SpecialTypeDataContract(Type type, XmlDictionaryString name, XmlDictionar private sealed class SpecialTypeDataContractCriticalHelper : DataContract.DataContractCriticalHelper { - internal SpecialTypeDataContractCriticalHelper(Type type, XmlDictionaryString name, XmlDictionaryString ns) : base(type) + internal SpecialTypeDataContractCriticalHelper( + [DynamicallyAccessedMembers(ClassDataContract.DataContractPreserveMemberTypes)] + Type type, + XmlDictionaryString name, XmlDictionaryString ns) : base(type) { SetDataContractName(name, ns); } diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/SurrogateDataContract.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/SurrogateDataContract.cs index c748213db1398d..f4322c2713b23d 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/SurrogateDataContract.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/SurrogateDataContract.cs @@ -7,11 +7,13 @@ namespace System.Runtime.Serialization using System.Security; using System.Runtime.CompilerServices; using System.Diagnostics; + using System.Diagnostics.CodeAnalysis; internal sealed class SurrogateDataContract : DataContract { private readonly SurrogateDataContractCriticalHelper _helper; + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal SurrogateDataContract(Type type, ISerializationSurrogate serializationSurrogate) : base(new SurrogateDataContractCriticalHelper(type, serializationSurrogate)) { @@ -23,6 +25,7 @@ internal ISerializationSurrogate SerializationSurrogate get { return _helper.SerializationSurrogate; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator xmlWriter, object obj, XmlObjectSerializerWriteContext? context) { Debug.Assert(context != null); @@ -56,6 +59,7 @@ private void SerializationSurrogateGetObjectData(object obj, SerializationInfo s SerializationSurrogate.GetObjectData(obj, serInfo, context); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext? context) { Debug.Assert(context != null); @@ -82,7 +86,11 @@ private sealed class SurrogateDataContractCriticalHelper : DataContract.DataCont { private readonly ISerializationSurrogate serializationSurrogate; - internal SurrogateDataContractCriticalHelper(Type type, ISerializationSurrogate serializationSurrogate) + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] + internal SurrogateDataContractCriticalHelper( + [DynamicallyAccessedMembers(ClassDataContract.DataContractPreserveMemberTypes)] + Type type, + ISerializationSurrogate serializationSurrogate) : base(type) { this.serializationSurrogate = serializationSurrogate; diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XPathQueryGenerator.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XPathQueryGenerator.cs index eb7d871ecf1f4c..b3cd0339cddf31 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XPathQueryGenerator.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XPathQueryGenerator.cs @@ -7,6 +7,7 @@ using System.Globalization; using System.Collections.Generic; using System.Xml; +using System.Diagnostics.CodeAnalysis; namespace System.Runtime.Serialization { @@ -17,12 +18,14 @@ public static class XPathQueryGenerator private const string XPathSeparator = "/"; private const string NsSeparator = ":"; + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public static string CreateFromDataContractSerializer(Type type, MemberInfo[] pathToMember, out XmlNamespaceManager namespaces) { return CreateFromDataContractSerializer(type, pathToMember, null, out namespaces); } // Here you can provide your own root element Xpath which will replace the Xpath of the top level element + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public static string CreateFromDataContractSerializer(Type type, MemberInfo[] pathToMember, StringBuilder? rootElementXpath, out XmlNamespaceManager namespaces) { if (type == null) @@ -56,6 +59,7 @@ public static string CreateFromDataContractSerializer(Type type, MemberInfo[] pa return context.XPath; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private static DataContract ProcessDataContract(DataContract contract, ExportContext context, MemberInfo memberNode) { if (contract is ClassDataContract) @@ -65,6 +69,7 @@ private static DataContract ProcessDataContract(DataContract contract, ExportCon throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.QueryGeneratorPathToMemberNotFound)); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private static DataContract ProcessClassDataContract(ClassDataContract contract, ExportContext context, MemberInfo memberNode) { string prefix = context.SetNamespace(contract.Namespace!.Value); diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlDataContract.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlDataContract.cs index f47a2f0a9dc33a..14730cade79926 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlDataContract.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlDataContract.cs @@ -14,12 +14,14 @@ namespace System.Runtime.Serialization using System.Security; using System.Linq; using System.Runtime.CompilerServices; + using System.Diagnostics.CodeAnalysis; internal delegate IXmlSerializable CreateXmlSerializableDelegate(); internal sealed class XmlDataContract : DataContract { private readonly XmlDataContractCriticalHelper _helper; + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal XmlDataContract(Type type) : base(new XmlDataContractCriticalHelper(type)) { _helper = (base.Helper as XmlDataContractCriticalHelper)!; @@ -27,6 +29,7 @@ internal XmlDataContract(Type type) : base(new XmlDataContractCriticalHelper(typ public override DataContractDictionary? KnownDataContracts { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { return _helper.KnownDataContracts; } @@ -82,6 +85,7 @@ internal bool IsTopLevelElementNullable internal CreateXmlSerializableDelegate CreateXmlSerializableDelegate { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { // We create XmlSerializableDelegate via CodeGen when CodeGen is enabled; @@ -122,7 +126,10 @@ private sealed class XmlDataContractCriticalHelper : DataContract.DataContractCr private CreateXmlSerializableDelegate? _createXmlSerializable; private XmlSchemaType? _xsdType; - internal XmlDataContractCriticalHelper(Type type) : base(type) + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] + internal XmlDataContractCriticalHelper( + [DynamicallyAccessedMembers(ClassDataContract.DataContractPreserveMemberTypes)] + Type type) : base(type) { if (type.IsDefined(Globals.TypeOfDataContractAttribute, false)) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.Format(SR.IXmlSerializableCannotHaveDataContract, DataContract.GetClrTypeFullName(type)))); @@ -167,6 +174,7 @@ internal XmlDataContractCriticalHelper(Type type) : base(type) internal override DataContractDictionary? KnownDataContracts { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (!_isKnownTypeAttributeChecked && UnderlyingType != null) @@ -236,18 +244,17 @@ internal CreateXmlSerializableDelegate? CreateXmlSerializableDelegate private ConstructorInfo? GetConstructor() { - Type type = UnderlyingType; - - if (type.IsValueType) + if (UnderlyingType.IsValueType) return null; - ConstructorInfo? ctor = type.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public, Type.EmptyTypes); + ConstructorInfo? ctor = UnderlyingType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public, Type.EmptyTypes); if (ctor == null) - throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.Format(SR.IXmlSerializableMustHaveDefaultConstructor, DataContract.GetClrTypeFullName(type)))); + throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.Format(SR.IXmlSerializableMustHaveDefaultConstructor, DataContract.GetClrTypeFullName(UnderlyingType)))); return ctor; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal CreateXmlSerializableDelegate GenerateCreateXmlSerializableDelegate() { Type type = this.UnderlyingType; @@ -364,6 +371,7 @@ internal IXmlSerializable ReflectionCreateXmlSerializable(Type type) } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override void WriteXmlValue(XmlWriterDelegator xmlWriter, object obj, XmlObjectSerializerWriteContext? context) { if (context == null) @@ -372,6 +380,7 @@ public override void WriteXmlValue(XmlWriterDelegator xmlWriter, object obj, Xml context.WriteIXmlSerializable(xmlWriter, obj); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public override object? ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext? context) { object? o; diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlFormatGeneratorStatics.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlFormatGeneratorStatics.cs index 654ab81627bce2..a20918b486f07d 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlFormatGeneratorStatics.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlFormatGeneratorStatics.cs @@ -5,6 +5,7 @@ using System.Xml; using System.Collections; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; namespace System.Runtime.Serialization { @@ -115,6 +116,7 @@ internal static MethodInfo GetCurrentMethod private static MethodInfo? s_getItemContractMethod; internal static MethodInfo GetItemContractMethod { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (s_getItemContractMethod == null) @@ -157,6 +159,7 @@ internal static MethodInfo IsStartElementMethod0 private static MethodInfo? s_getUninitializedObjectMethod; internal static MethodInfo GetUninitializedObjectMethod { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (s_getUninitializedObjectMethod == null) @@ -204,6 +207,7 @@ internal static PropertyInfo NodeTypeProperty private static ConstructorInfo? s_hashtableCtor; internal static ConstructorInfo HashtableCtor { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (s_hashtableCtor == null) @@ -344,6 +348,7 @@ internal static MethodInfo IncrementItemCountMethod private static MethodInfo? s_internalDeserializeMethod; internal static MethodInfo InternalDeserializeMethod { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (s_internalDeserializeMethod == null) @@ -372,6 +377,7 @@ internal static MethodInfo MoveToNextElementMethod private static MethodInfo? s_getMemberIndexMethod; internal static MethodInfo GetMemberIndexMethod { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (s_getMemberIndexMethod == null) @@ -386,6 +392,7 @@ internal static MethodInfo GetMemberIndexMethod private static MethodInfo? s_getMemberIndexWithRequiredMembersMethod; internal static MethodInfo GetMemberIndexWithRequiredMembersMethod { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (s_getMemberIndexWithRequiredMembersMethod == null) @@ -428,6 +435,7 @@ internal static MethodInfo SkipUnknownElementMethod private static MethodInfo? s_readIfNullOrRefMethod; internal static MethodInfo ReadIfNullOrRefMethod { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (s_readIfNullOrRefMethod == null) @@ -600,7 +608,7 @@ internal static MethodInfo GetArrayLengthMethod { if (s_getArrayLengthMethod == null) { - s_getArrayLengthMethod = Globals.TypeOfArray.GetProperty("Length")!.GetMethod; + s_getArrayLengthMethod = typeof(Array).GetProperty("Length")!.GetMethod; Debug.Assert(s_getArrayLengthMethod != null); } return s_getArrayLengthMethod; @@ -624,6 +632,7 @@ internal static MethodInfo CreateSerializationExceptionMethod private static MethodInfo? s_readSerializationInfoMethod; internal static MethodInfo ReadSerializationInfoMethod { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (s_readSerializationInfoMethod == null) @@ -652,6 +661,7 @@ internal static MethodInfo CreateUnexpectedStateExceptionMethod private static MethodInfo? s_internalSerializeReferenceMethod; internal static MethodInfo InternalSerializeReferenceMethod { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (s_internalSerializeReferenceMethod == null) @@ -666,6 +676,7 @@ internal static MethodInfo InternalSerializeReferenceMethod private static MethodInfo? s_internalSerializeMethod; internal static MethodInfo InternalSerializeMethod { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (s_internalSerializeMethod == null) @@ -680,6 +691,7 @@ internal static MethodInfo InternalSerializeMethod private static MethodInfo? s_writeNullMethod; internal static MethodInfo WriteNullMethod { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (s_writeNullMethod == null) @@ -747,6 +759,8 @@ internal static MethodInfo GetDefaultValueMethod } } + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2060:MakeGenericMethod", + Justification = "The call to MakeGenericMethod is safe due to the fact that XmlObjectSerializerWriteContext.GetDefaultValue is not annotated.")] internal static object? GetDefaultValue(Type type) { return GetDefaultValueMethod.MakeGenericMethod(type).Invoke(null, Array.Empty()); @@ -797,6 +811,7 @@ internal static MethodInfo GetHasValueMethod private static MethodInfo? s_writeISerializableMethod; internal static MethodInfo WriteISerializableMethod { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (s_writeISerializableMethod == null) @@ -824,12 +839,23 @@ internal static MethodInfo IsMemberTypeSameAsMemberValue } private static MethodInfo? s_writeExtensionDataMethod; - internal static MethodInfo WriteExtensionDataMethod => s_writeExtensionDataMethod ?? - (s_writeExtensionDataMethod = typeof(XmlObjectSerializerWriteContext).GetMethod("WriteExtensionData", Globals.ScanAllMembers)!); + internal static MethodInfo WriteExtensionDataMethod + { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] + get + { + if (s_writeExtensionDataMethod == null) + { + s_writeExtensionDataMethod = typeof(XmlObjectSerializerWriteContext).GetMethod("WriteExtensionData", Globals.ScanAllMembers)!; + } + return s_writeExtensionDataMethod; + } + } private static MethodInfo? s_writeXmlValueMethod; internal static MethodInfo WriteXmlValueMethod { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (s_writeXmlValueMethod == null) @@ -844,6 +870,7 @@ internal static MethodInfo WriteXmlValueMethod private static MethodInfo? s_readXmlValueMethod; internal static MethodInfo ReadXmlValueMethod { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (s_readXmlValueMethod == null) @@ -904,6 +931,7 @@ internal static FieldInfo MemberNamesField private static PropertyInfo? s_childElementNamespacesProperty; internal static PropertyInfo ChildElementNamespacesProperty { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (s_childElementNamespacesProperty == null) @@ -932,6 +960,7 @@ internal static PropertyInfo CollectionItemNameProperty private static PropertyInfo? s_childElementNamespaceProperty; internal static PropertyInfo ChildElementNamespaceProperty { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { if (s_childElementNamespaceProperty == null) diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlFormatReaderGenerator.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlFormatReaderGenerator.cs index 0a716e0468ccc6..acdbdfe00db912 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlFormatReaderGenerator.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlFormatReaderGenerator.cs @@ -30,16 +30,19 @@ public XmlFormatReaderGenerator() _helper = new CriticalHelper(); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public XmlFormatClassReaderDelegate GenerateClassReader(ClassDataContract classContract) { return _helper.GenerateClassReader(classContract); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public XmlFormatCollectionReaderDelegate GenerateCollectionReader(CollectionDataContract collectionContract) { return _helper.GenerateCollectionReader(collectionContract); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public XmlFormatGetOnlyCollectionReaderDelegate GenerateGetOnlyCollectionReader(CollectionDataContract collectionContract) { return _helper.GenerateGetOnlyCollectionReader(collectionContract); @@ -61,11 +64,13 @@ private sealed class CriticalHelper private ArgBuilder _memberNamespacesArg = null!; // initialized in InitArgs private ArgBuilder? _collectionContractArg; + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private XmlFormatClassReaderDelegate CreateReflectionXmlClassReader(ClassDataContract classContract) { return new ReflectionXmlClassReader(classContract).ReflectionReadClass; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public XmlFormatClassReaderDelegate GenerateClassReader(ClassDataContract classContract) { if (DataContractSerializer.Option == SerializationOption.ReflectionOnly) @@ -149,11 +154,13 @@ public XmlFormatClassReaderDelegate GenerateClassReader(ClassDataContract classC } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private XmlFormatCollectionReaderDelegate CreateReflectionXmlCollectionReader() { return new ReflectionXmlCollectionReader().ReflectionReadCollection; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public XmlFormatCollectionReaderDelegate GenerateCollectionReader(CollectionDataContract collectionContract) { if (DataContractSerializer.Option == SerializationOption.ReflectionOnly) @@ -170,11 +177,13 @@ public XmlFormatCollectionReaderDelegate GenerateCollectionReader(CollectionData } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private XmlFormatGetOnlyCollectionReaderDelegate CreateReflectionReadGetOnlyCollectionReader() { return new ReflectionXmlCollectionReader().ReflectionReadGetOnlyCollection; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public XmlFormatGetOnlyCollectionReaderDelegate GenerateGetOnlyCollectionReader(CollectionDataContract collectionContract) { if (DataContractSerializer.Option == SerializationOption.ReflectionOnly) @@ -230,6 +239,7 @@ private void InitArgs() [MemberNotNull(nameof(_objectType))] [MemberNotNull(nameof(_objectLocal))] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void CreateObject(ClassDataContract classContract) { Type type = _objectType = classContract.UnderlyingType; @@ -240,7 +250,7 @@ private void CreateObject(ClassDataContract classContract) if (classContract.UnderlyingType == Globals.TypeOfDBNull) { - _ilg.LoadMember(Globals.TypeOfDBNull.GetField("Value")!); + _ilg.LoadMember(GetDBNullValueField()); _ilg.Stloc(_objectLocal); } else if (classContract.IsNonAttributedType) @@ -264,6 +274,8 @@ private void CreateObject(ClassDataContract classContract) } } + private static FieldInfo GetDBNullValueField() => typeof(DBNull).GetField("Value")!; + private void InvokeOnDeserializing(ClassDataContract classContract) { Debug.Assert(_objectLocal != null); @@ -321,6 +333,7 @@ private bool InvokeFactoryMethod(ClassDataContract classContract, LocalBuilder? return false; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void ReadClass(ClassDataContract classContract) { if (classContract.HasExtensionData) @@ -345,6 +358,7 @@ private void ReadClass(ClassDataContract classContract) } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void ReadMembers(ClassDataContract classContract, LocalBuilder? extensionDataLocal) { int memberCount = classContract.MemberNames!.Length; @@ -376,6 +390,7 @@ private void ReadMembers(ClassDataContract classContract, LocalBuilder? extensio } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private int ReadMembers(ClassDataContract classContract, bool[] requiredMembers, Label[] memberLabels, LocalBuilder memberIndexLocal, LocalBuilder? requiredIndexLocal) { Debug.Assert(_objectLocal != null); @@ -448,6 +463,7 @@ private int GetRequiredMembers(ClassDataContract contract, bool[] requiredMember return memberCount; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void ReadISerializable(ClassDataContract classContract) { Debug.Assert(_objectLocal != null); @@ -462,6 +478,7 @@ private void ReadISerializable(ClassDataContract classContract) _ilg.Call(ctor); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private LocalBuilder ReadValue(Type type, string name, string ns) { LocalBuilder value = _ilg.DeclareLocal(type, "valueRead"); @@ -552,6 +569,7 @@ private LocalBuilder ReadValue(Type type, string name, string ns) return value; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void InternalDeserialize(LocalBuilder value, Type type, string name, string ns) { _ilg.Load(_contextArg); @@ -567,6 +585,7 @@ private void InternalDeserialize(LocalBuilder value, Type type, string name, str _ilg.Stloc(value); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void WrapNullableObject(LocalBuilder innerValue, LocalBuilder outerValue, int nullables) { Type innerType = innerValue.LocalType, outerType = outerValue.LocalType; @@ -582,6 +601,7 @@ private void WrapNullableObject(LocalBuilder innerValue, LocalBuilder outerValue } [MemberNotNull(nameof(_objectLocal))] + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void ReadCollection(CollectionDataContract collectionContract) { Type type = collectionContract.UnderlyingType; @@ -722,6 +742,7 @@ private void ReadCollection(CollectionDataContract collectionContract) } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void ReadGetOnlyCollection(CollectionDataContract collectionContract) { Type type = collectionContract.UnderlyingType; @@ -784,6 +805,7 @@ private void ReadGetOnlyCollection(CollectionDataContract collectionContract) _ilg.EndIf(); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private bool TryReadPrimitiveArray(Type type, Type itemType, LocalBuilder size) { Debug.Assert(_objectLocal != null); @@ -833,6 +855,7 @@ private bool TryReadPrimitiveArray(Type type, Type itemType, LocalBuilder size) return false; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private LocalBuilder ReadCollectionItem(CollectionDataContract collectionContract, Type itemType, string itemName, string itemNs) { if (collectionContract.Kind == CollectionKind.Dictionary || collectionContract.Kind == CollectionKind.GenericDictionary) @@ -854,6 +877,7 @@ private LocalBuilder ReadCollectionItem(CollectionDataContract collectionContrac } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void StoreCollectionValue(LocalBuilder collection, LocalBuilder value, CollectionDataContract collectionContract) { Debug.Assert(collectionContract.AddMethod != null); @@ -940,7 +964,9 @@ private void ThrowValidationException() } } - internal static object UnsafeGetUninitializedObject(Type type) + internal static object UnsafeGetUninitializedObject( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] + Type type) { return RuntimeHelpers.GetUninitializedObject(type); } @@ -950,6 +976,7 @@ internal static object UnsafeGetUninitializedObject(Type type) /// Safe - marked as such so that it's callable from transparent generated IL. Takes id as parameter which /// is guaranteed to be in internal serialization cache. /// + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static object UnsafeGetUninitializedObject(int id) { var type = DataContract.GetDataContractForInitialization(id).TypeForInitialization; diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlFormatWriterGenerator.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlFormatWriterGenerator.cs index 53895dab0532d9..b8d4c22bab0e37 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlFormatWriterGenerator.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlFormatWriterGenerator.cs @@ -12,6 +12,7 @@ using System.Security; using System.Runtime.CompilerServices; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; namespace System.Runtime.Serialization { @@ -26,11 +27,13 @@ public XmlFormatWriterGenerator() _helper = new CriticalHelper(); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal XmlFormatClassWriterDelegate GenerateClassWriter(ClassDataContract classContract) { return _helper.GenerateClassWriter(classContract); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal XmlFormatCollectionWriterDelegate GenerateCollectionWriter(CollectionDataContract collectionContract) { return _helper.GenerateCollectionWriter(collectionContract); @@ -56,11 +59,13 @@ private sealed class CriticalHelper private int _typeIndex = 1; private int _childElementIndex; + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private XmlFormatClassWriterDelegate CreateReflectionXmlFormatClassWriterDelegate() { return new ReflectionXmlFormatWriter().ReflectionWriteClass; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal XmlFormatClassWriterDelegate GenerateClassWriter(ClassDataContract classContract) { if (DataContractSerializer.Option == SerializationOption.ReflectionOnly) @@ -92,11 +97,13 @@ internal XmlFormatClassWriterDelegate GenerateClassWriter(ClassDataContract clas } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private XmlFormatCollectionWriterDelegate CreateReflectionXmlFormatCollectionWriterDelegate() { return new ReflectionXmlFormatWriter().ReflectionWriteCollection; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal XmlFormatCollectionWriterDelegate GenerateCollectionWriter(CollectionDataContract collectionContract) { if (DataContractSerializer.Option == SerializationOption.ReflectionOnly) @@ -128,6 +135,7 @@ internal XmlFormatCollectionWriterDelegate GenerateCollectionWriter(CollectionDa } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void InitArgs(Type objType) { _xmlWriterArg = _ilg.GetArg(0); @@ -188,6 +196,7 @@ private void InvokeOnSerialized(ClassDataContract classContract) } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void WriteClass(ClassDataContract classContract) { InvokeOnSerializing(classContract); @@ -240,6 +249,7 @@ private void WriteClass(ClassDataContract classContract) InvokeOnSerialized(classContract); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private int WriteMembers(ClassDataContract classContract, LocalBuilder? extensionDataLocal, ClassDataContract derivedMostClassContract) { int memberCount = (classContract.BaseContract == null) ? 0 : @@ -323,6 +333,7 @@ private LocalBuilder LoadMemberValue(DataMember member) return memberValue; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void WriteCollection(CollectionDataContract collectionContract) { LocalBuilder itemNamespace = _ilg.DeclareLocal(typeof(XmlDictionaryString), "itemNamespace"); @@ -491,6 +502,7 @@ private void WriteCollection(CollectionDataContract collectionContract) } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private bool TryWritePrimitive(Type type, LocalBuilder? value, MemberInfo? memberInfo, LocalBuilder? arrayItemIndex, LocalBuilder ns, LocalBuilder? name, int nameIndex) { PrimitiveDataContract? primitiveContract = PrimitiveDataContract.GetPrimitiveDataContract(type); @@ -537,6 +549,7 @@ private bool TryWritePrimitive(Type type, LocalBuilder? value, MemberInfo? membe return true; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private bool TryWritePrimitiveArray(Type type, Type itemType, LocalBuilder value, LocalBuilder itemName, LocalBuilder itemNamespace) { PrimitiveDataContract? primitiveContract = PrimitiveDataContract.GetPrimitiveDataContract(itemType); @@ -582,6 +595,7 @@ private bool TryWritePrimitiveArray(Type type, Type itemType, LocalBuilder value return false; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void WriteValue(LocalBuilder memberValue, bool writeXsiType) { Type memberType = memberValue.LocalType; @@ -665,6 +679,7 @@ private void InternalSerialize(MethodInfo methodInfo, LocalBuilder memberValue, } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private LocalBuilder UnwrapNullableObject(LocalBuilder memberValue)// Leaves !HasValue on stack { Type memberType = memberValue.LocalType; diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializer.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializer.cs index 4d452bf64dc576..011d03454e7608 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializer.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializer.cs @@ -12,13 +12,18 @@ namespace System.Runtime.Serialization using System.Text; using System.Security; using DataContractDictionary = System.Collections.Generic.Dictionary; + using System.Diagnostics.CodeAnalysis; public abstract class XmlObjectSerializer { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public abstract void WriteStartObject(XmlDictionaryWriter writer, object? graph); + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public abstract void WriteObjectContent(XmlDictionaryWriter writer, object? graph); + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public abstract void WriteEndObject(XmlDictionaryWriter writer); + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public virtual void WriteObject(Stream stream, object? graph) { CheckNull(stream, nameof(stream)); @@ -27,40 +32,47 @@ public virtual void WriteObject(Stream stream, object? graph) writer.Flush(); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public virtual void WriteObject(XmlWriter writer, object? graph) { CheckNull(writer, nameof(writer)); WriteObject(XmlDictionaryWriter.CreateDictionaryWriter(writer), graph); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public virtual void WriteStartObject(XmlWriter writer, object? graph) { CheckNull(writer, nameof(writer)); WriteStartObject(XmlDictionaryWriter.CreateDictionaryWriter(writer), graph); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public virtual void WriteObjectContent(XmlWriter writer, object? graph) { CheckNull(writer, nameof(writer)); WriteObjectContent(XmlDictionaryWriter.CreateDictionaryWriter(writer), graph); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public virtual void WriteEndObject(XmlWriter writer) { CheckNull(writer, nameof(writer)); WriteEndObject(XmlDictionaryWriter.CreateDictionaryWriter(writer)); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public virtual void WriteObject(XmlDictionaryWriter writer, object? graph) { WriteObjectHandleExceptions(new XmlWriterDelegator(writer), graph); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal void WriteObjectHandleExceptions(XmlWriterDelegator writer, object? graph) { WriteObjectHandleExceptions(writer, graph, null); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal void WriteObjectHandleExceptions(XmlWriterDelegator writer, object? graph, DataContractResolver? dataContractResolver) { try @@ -82,12 +94,14 @@ internal void WriteObjectHandleExceptions(XmlWriterDelegator writer, object? gra internal virtual DataContractDictionary? KnownDataContracts { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { return null; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal virtual void InternalWriteObject(XmlWriterDelegator writer, object? graph) { WriteStartObject(writer.Writer, graph); @@ -95,27 +109,32 @@ internal virtual void InternalWriteObject(XmlWriterDelegator writer, object? gra WriteEndObject(writer.Writer); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal virtual void InternalWriteObject(XmlWriterDelegator writer, object? graph, DataContractResolver? dataContractResolver) { InternalWriteObject(writer, graph); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal virtual void InternalWriteStartObject(XmlWriterDelegator writer, object? graph) { DiagnosticUtility.DebugAssert("XmlObjectSerializer.InternalWriteStartObject should never get called"); throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException()); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal virtual void InternalWriteObjectContent(XmlWriterDelegator writer, object? graph) { DiagnosticUtility.DebugAssert("XmlObjectSerializer.InternalWriteObjectContent should never get called"); throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException()); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal virtual void InternalWriteEndObject(XmlWriterDelegator writer) { DiagnosticUtility.DebugAssert("XmlObjectSerializer.InternalWriteEndObject should never get called"); throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException()); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal void WriteStartObjectHandleExceptions(XmlWriterDelegator writer, object? graph) { try @@ -133,6 +152,7 @@ internal void WriteStartObjectHandleExceptions(XmlWriterDelegator writer, object } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal void WriteObjectContentHandleExceptions(XmlWriterDelegator writer, object? graph) { try @@ -154,6 +174,7 @@ internal void WriteObjectContentHandleExceptions(XmlWriterDelegator writer, obje } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal void WriteEndObjectHandleExceptions(XmlWriterDelegator writer) { try @@ -217,60 +238,72 @@ internal static bool IsContractDeclared(DataContract contract, DataContract decl || (contract.Name.Value == declaredContract.Name.Value && contract.Namespace.Value == declaredContract.Namespace.Value); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public virtual object? ReadObject(Stream stream) { CheckNull(stream, nameof(stream)); return ReadObject(XmlDictionaryReader.CreateTextReader(stream, XmlDictionaryReaderQuotas.Max)); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public virtual object? ReadObject(XmlReader reader) { CheckNull(reader, nameof(reader)); return ReadObject(XmlDictionaryReader.CreateDictionaryReader(reader)); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public virtual object? ReadObject(XmlDictionaryReader reader) { return ReadObjectHandleExceptions(new XmlReaderDelegator(reader), true /*verifyObjectName*/); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public virtual object? ReadObject(XmlReader reader, bool verifyObjectName) { CheckNull(reader, nameof(reader)); return ReadObject(XmlDictionaryReader.CreateDictionaryReader(reader), verifyObjectName); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public abstract object? ReadObject(XmlDictionaryReader reader, bool verifyObjectName); + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public virtual bool IsStartObject(XmlReader reader) { CheckNull(reader, nameof(reader)); return IsStartObject(XmlDictionaryReader.CreateDictionaryReader(reader)); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public abstract bool IsStartObject(XmlDictionaryReader reader); + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal virtual object? InternalReadObject(XmlReaderDelegator reader, bool verifyObjectName) { return ReadObject(reader.UnderlyingReader, verifyObjectName); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal virtual object? InternalReadObject(XmlReaderDelegator reader, bool verifyObjectName, DataContractResolver? dataContractResolver) { return InternalReadObject(reader, verifyObjectName); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal virtual bool InternalIsStartObject(XmlReaderDelegator reader) { DiagnosticUtility.DebugAssert("XmlObjectSerializer.InternalIsStartObject should never get called"); throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException()); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal object? ReadObjectHandleExceptions(XmlReaderDelegator reader, bool verifyObjectName) { return ReadObjectHandleExceptions(reader, verifyObjectName, null); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal object? ReadObjectHandleExceptions(XmlReaderDelegator reader, bool verifyObjectName, DataContractResolver? dataContractResolver) { try @@ -288,6 +321,7 @@ internal virtual bool InternalIsStartObject(XmlReaderDelegator reader) } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal bool IsStartObjectHandleExceptions(XmlReaderDelegator reader) { try @@ -315,6 +349,7 @@ internal bool IsStartElement(XmlReaderDelegator reader) return (reader.MoveToElement() || reader.IsStartElement()); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal bool IsRootElement(XmlReaderDelegator reader, DataContract contract, XmlDictionaryString? name, XmlDictionaryString? ns) { reader.MoveToElement(); diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerContext.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerContext.cs index 765f02b378b7b7..9323ae87acaa25 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerContext.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerContext.cs @@ -6,8 +6,9 @@ namespace System.Runtime.Serialization using System; using System.Collections.Generic; using System.Diagnostics; + using System.Diagnostics.CodeAnalysis; using System.Reflection; - using System.Security; + using System.Security; using System.Xml; using DataContractDictionary = System.Collections.Generic.Dictionary; @@ -106,11 +107,13 @@ protected KnownTypeDataContractResolver KnownTypeResolver } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal DataContract GetDataContract(Type type) { return GetDataContract(type.TypeHandle, type); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal virtual DataContract GetDataContract(RuntimeTypeHandle typeHandle, Type? type) { if (IsGetOnlyCollection) @@ -123,6 +126,7 @@ internal virtual DataContract GetDataContract(RuntimeTypeHandle typeHandle, Type } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal virtual DataContract GetDataContractSkipValidation(int typeId, RuntimeTypeHandle typeHandle, Type? type) { if (IsGetOnlyCollection) @@ -135,7 +139,7 @@ internal virtual DataContract GetDataContractSkipValidation(int typeId, RuntimeT } } - + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal virtual DataContract GetDataContract(int id, RuntimeTypeHandle typeHandle) { if (IsGetOnlyCollection) @@ -148,18 +152,21 @@ internal virtual DataContract GetDataContract(int id, RuntimeTypeHandle typeHand } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal virtual void CheckIfTypeSerializable(Type memberType, bool isMemberTypeSerializable) { if (!isMemberTypeSerializable) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.Format(SR.TypeNotSerializable, memberType))); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal virtual Type GetSurrogatedType(Type type) { return type; } internal virtual DataContractDictionary? SerializerKnownDataContracts { + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] get { // This field must be initialized during construction by serializers using data contracts. @@ -172,6 +179,7 @@ internal virtual DataContractDictionary? SerializerKnownDataContracts } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private DataContract? GetDataContractFromSerializerKnownTypes(XmlQualifiedName qname) { DataContractDictionary? serializerKnownDataContracts = this.SerializerKnownDataContracts; @@ -181,6 +189,7 @@ internal virtual DataContractDictionary? SerializerKnownDataContracts return serializerKnownDataContracts.TryGetValue(qname, out outDataContract) ? outDataContract : null; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static DataContractDictionary? GetDataContractsForKnownTypes(IList knownTypeList) { if (knownTypeList == null) return null; @@ -197,6 +206,7 @@ internal virtual DataContractDictionary? SerializerKnownDataContracts return dataContracts; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal bool IsKnownType(DataContract dataContract, DataContractDictionary? knownDataContracts, Type? declaredType) { bool knownTypesAddedInCurrentScope = false; @@ -215,18 +225,21 @@ internal bool IsKnownType(DataContract dataContract, DataContractDictionary? kno return isKnownType; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] 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; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal Type? ResolveNameFromKnownTypes(XmlQualifiedName typeName) { DataContract? dataContract = ResolveDataContractFromKnownTypes(typeName); return dataContract == null ? null : dataContract.UnderlyingType; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private DataContract? ResolveDataContractFromKnownTypes(XmlQualifiedName typeName) { DataContract? dataContract = PrimitiveDataContract.GetPrimitiveDataContract(typeName.Name, typeName.Namespace); @@ -241,6 +254,7 @@ internal bool IsKnownType(DataContract dataContract, Type? declaredType) return dataContract; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected DataContract? ResolveDataContractFromKnownTypes(string typeName, string? typeNs, DataContract? memberTypeContract, Type? declaredType) { XmlQualifiedName qname = new XmlQualifiedName(typeName, typeNs); @@ -285,6 +299,7 @@ internal bool IsKnownType(DataContract dataContract, Type? declaredType) return dataContract; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal void PushKnownTypes(DataContract dc) { if (dc != null && dc.KnownDataContracts != null) @@ -293,6 +308,7 @@ internal void PushKnownTypes(DataContract dc) } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal void PopKnownTypes(DataContract dc) { if (dc != null && dc.KnownDataContracts != null) diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerReadContext.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerReadContext.cs index e29728f553c0bf..4ba8da9b6cc303 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerReadContext.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerReadContext.cs @@ -90,19 +90,21 @@ internal XmlObjectSerializerReadContext(DataContractSerializer serializer, DataC this.attributes = new Attributes(); } - + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal virtual object? InternalDeserialize(XmlReaderDelegator xmlReader, int id, RuntimeTypeHandle declaredTypeHandle, string name, string ns) { DataContract dataContract = GetDataContract(id, declaredTypeHandle); return InternalDeserialize(xmlReader, name, ns, Type.GetTypeFromHandle(declaredTypeHandle), ref dataContract); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal virtual object? InternalDeserialize(XmlReaderDelegator xmlReader, Type declaredType, string name, string ns) { DataContract dataContract = GetDataContract(declaredType); return InternalDeserialize(xmlReader, name, ns, declaredType, ref dataContract); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal virtual object? InternalDeserialize(XmlReaderDelegator xmlReader, Type declaredType, DataContract? dataContract, string? name, string? ns) { if (dataContract == null) @@ -135,6 +137,7 @@ protected bool TryHandleNullOrRef(XmlReaderDelegator reader, Type declaredType, return false; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected object? InternalDeserialize(XmlReaderDelegator reader, string? name, string? ns, Type declaredType, ref DataContract dataContract) { object? retObj = null; @@ -214,6 +217,7 @@ internal static bool MoveToNextElement(XmlReaderDelegator xmlReader) return (xmlReader.MoveToContent() != XmlNodeType.EndElement); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal int GetMemberIndex(XmlReaderDelegator xmlReader, XmlDictionaryString[] memberNames, XmlDictionaryString[] memberNamespaces, int memberIndex, ExtensionDataObject? extensionData) { for (int i = memberIndex + 1; i < memberNames.Length; i++) @@ -225,6 +229,7 @@ internal int GetMemberIndex(XmlReaderDelegator xmlReader, XmlDictionaryString[] return memberNames.Length; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal int GetMemberIndexWithRequiredMembers(XmlReaderDelegator xmlReader, XmlDictionaryString[] memberNames, XmlDictionaryString[] memberNamespaces, int memberIndex, int requiredIndex, ExtensionDataObject? extensionData) { for (int i = memberIndex + 1; i < memberNames.Length; i++) @@ -255,6 +260,7 @@ internal static void ThrowRequiredMemberMissingException(XmlReaderDelegator xmlR throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(XmlObjectSerializer.TryAddLineInfo(xmlReader, SR.Format(SR.UnexpectedElementExpectingElements, xmlReader.NodeType, xmlReader.LocalName, xmlReader.NamespaceURI, stringBuilder.ToString())))); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected void HandleMemberNotFound(XmlReaderDelegator xmlReader, ExtensionDataObject? extensionData, int memberIndex) { xmlReader.MoveToContent(); @@ -267,6 +273,7 @@ protected void HandleMemberNotFound(XmlReaderDelegator xmlReader, ExtensionDataO HandleUnknownElement(xmlReader, extensionData, memberIndex); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal void HandleUnknownElement(XmlReaderDelegator xmlReader, ExtensionDataObject extensionData, int memberIndex) { if (extensionData.Members == null) @@ -280,6 +287,7 @@ internal void SkipUnknownElement(XmlReaderDelegator xmlReader) xmlReader.Skip(); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal string ReadIfNullOrRef(XmlReaderDelegator xmlReader, Type memberType, bool isMemberTypeSerializable) { Debug.Assert(attributes != null); @@ -457,6 +465,7 @@ internal void CheckEndOfArray(XmlReaderDelegator xmlReader, int arraySize, XmlDi throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(CreateUnexpectedStateException(XmlNodeType.EndElement, xmlReader)); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal object? ReadIXmlSerializable(XmlReaderDelegator xmlReader, XmlDataContract xmlDataContract, bool isMemberType) { if (_xmlSerializableReader == null) @@ -464,11 +473,13 @@ internal void CheckEndOfArray(XmlReaderDelegator xmlReader, int arraySize, XmlDi return ReadIXmlSerializable(_xmlSerializableReader, xmlReader, xmlDataContract, isMemberType); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static object? ReadRootIXmlSerializable(XmlReaderDelegator xmlReader, XmlDataContract xmlDataContract, bool isMemberType) { return ReadIXmlSerializable(new XmlSerializableReader(), xmlReader, xmlDataContract, isMemberType); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal static object? ReadIXmlSerializable(XmlSerializableReader xmlSerializableReader, XmlReaderDelegator xmlReader, XmlDataContract xmlDataContract, bool isMemberType) { object? obj = null; @@ -499,6 +510,7 @@ internal void CheckEndOfArray(XmlReaderDelegator xmlReader, int arraySize, XmlDi return obj; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public SerializationInfo ReadSerializationInfo(XmlReaderDelegator xmlReader, Type type) { var serInfo = new SerializationInfo(type, XmlObjectSerializer.FormatterConverter); @@ -542,6 +554,7 @@ public SerializationInfo ReadSerializationInfo(XmlReaderDelegator xmlReader, Typ return serInfo; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected virtual DataContract? ResolveDataContractFromTypeName() { Debug.Assert(attributes != null); @@ -549,6 +562,7 @@ public SerializationInfo ReadSerializationInfo(XmlReaderDelegator xmlReader, Typ return (attributes.XsiTypeName == null) ? null : ResolveDataContractFromKnownTypes(attributes.XsiTypeName, attributes.XsiTypeNamespace, null /*memberTypeContract*/, null); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private ExtensionDataMember ReadExtensionDataMember(XmlReaderDelegator xmlReader, int memberIndex) { var member = new ExtensionDataMember(xmlReader.LocalName, xmlReader.NamespaceURI) @@ -560,6 +574,7 @@ private ExtensionDataMember ReadExtensionDataMember(XmlReaderDelegator xmlReader return member; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public IDataNode? ReadExtensionDataValue(XmlReaderDelegator xmlReader) { ReadAttributes(xmlReader); @@ -657,6 +672,7 @@ protected virtual void StartReadExtensionDataValue(XmlReaderDelegator xmlReader) { } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private IDataNode ReadExtensionDataValue(XmlReaderDelegator xmlReader, string? dataContractName, string? dataContractNamespace) { Debug.Assert(attributes != null); @@ -730,6 +746,7 @@ private IDataNode ReadUnknownPrimitiveData(XmlReaderDelegator xmlReader, Type ty return dataNode; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private ClassDataNode ReadUnknownClassData(XmlReaderDelegator xmlReader, string? dataContractName, string? dataContractNamespace) { var dataNode = new ClassDataNode(); @@ -750,6 +767,7 @@ private ClassDataNode ReadUnknownClassData(XmlReaderDelegator xmlReader, string? return dataNode; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private CollectionDataNode ReadUnknownCollectionData(XmlReaderDelegator xmlReader, string? dataContractName, string? dataContractNamespace) { Debug.Assert(attributes != null); @@ -806,6 +824,7 @@ private CollectionDataNode ReadUnknownCollectionData(XmlReaderDelegator xmlReade return dataNode; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private ISerializableDataNode ReadUnknownISerializableData(XmlReaderDelegator xmlReader, string? dataContractName, string? dataContractNamespace) { Debug.Assert(attributes != null); @@ -886,6 +905,7 @@ private IDataNode ReadUnknownXmlData(XmlReaderDelegator xmlReader, string? dataC // all items have the same name and namespace. To recognize as an ISerializable type, it requires that all // items be unqualified. If the XML only contains elements (no attributes or other nodes) is recognized as a // class/class hierarchy. Otherwise it is deserialized as XML. + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private IDataNode ReadAndResolveUnknownXmlData(XmlReaderDelegator xmlReader, IDictionary? namespaces, string? dataContractName, string? dataContractNamespace) { @@ -1029,6 +1049,7 @@ internal static Exception CreateSerializationException(string message) return XmlObjectSerializer.CreateSerializationException(message); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected virtual object? ReadDataContractValue(DataContract dataContract, XmlReaderDelegator reader) { return dataContract.ReadXmlValue(reader, this); diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerReadContextComplex.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerReadContextComplex.cs index 60d6d370f5d155..65d6c1491a488f 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerReadContextComplex.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerReadContextComplex.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Reflection; namespace System.Runtime.Serialization @@ -30,6 +31,7 @@ internal override SerializationMode Mode get { return _mode; } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override object? InternalDeserialize(XmlReaderDelegator xmlReader, int declaredTypeID, RuntimeTypeHandle declaredTypeHandle, string name, string ns) { if (_mode == SerializationMode.SharedContract) @@ -45,6 +47,7 @@ internal override SerializationMode Mode } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override object? InternalDeserialize(XmlReaderDelegator xmlReader, Type declaredType, string name, string ns) { if (_mode == SerializationMode.SharedContract) @@ -60,6 +63,7 @@ internal override SerializationMode Mode } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override object? InternalDeserialize(XmlReaderDelegator xmlReader, Type declaredType, DataContract? dataContract, string? name, string? ns) { if (_mode == SerializationMode.SharedContract) @@ -75,6 +79,7 @@ internal override SerializationMode Mode } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private object? InternalDeserializeInSharedTypeMode(XmlReaderDelegator xmlReader, int declaredTypeID, Type declaredType, string? name, string? ns) { Debug.Assert(attributes != null); @@ -117,6 +122,7 @@ internal override SerializationMode Mode return ReadDataContractValue(dataContract, xmlReader); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private object? InternalDeserializeWithSurrogate(XmlReaderDelegator xmlReader, Type declaredType, DataContract? surrogateDataContract, string? name, string? ns) { Debug.Assert(_serializationSurrogateProvider != null); @@ -143,6 +149,7 @@ private Type ResolveDataContractTypeInSharedTypeMode(string assemblyName, string throw new PlatformNotSupportedException(SR.PlatformNotSupported_NetDataContractSerializer); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private DataContract? ResolveDataContractInSharedTypeMode(string assemblyName, string typeName, out Assembly assembly, out Type type) { type = ResolveDataContractTypeInSharedTypeMode(assemblyName, typeName, out assembly); @@ -154,6 +161,7 @@ private Type ResolveDataContractTypeInSharedTypeMode(string assemblyName, string return null; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected override DataContract? ResolveDataContractFromTypeName() { Debug.Assert(attributes != null); @@ -174,6 +182,7 @@ private Type ResolveDataContractTypeInSharedTypeMode(string assemblyName, string return null; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override void CheckIfTypeSerializable(Type memberType, bool isMemberTypeSerializable) { if (_serializationSurrogateProvider != null) @@ -189,6 +198,7 @@ internal override void CheckIfTypeSerializable(Type memberType, bool isMemberTyp base.CheckIfTypeSerializable(memberType, isMemberTypeSerializable); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override Type GetSurrogatedType(Type type) { if (_serializationSurrogateProvider == null) diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerWriteContext.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerWriteContext.cs index 76cc63f22c2e7a..48273f9792204b 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerWriteContext.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerWriteContext.cs @@ -87,6 +87,7 @@ internal void ResetIsGetOnlyCollection() _isGetOnlyCollection = false; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal void InternalSerializeReference(XmlWriterDelegator xmlWriter, object obj, bool isDeclaredType, bool writeXsiType, int declaredTypeID, RuntimeTypeHandle declaredTypeHandle) { if (!OnHandleReference(xmlWriter, obj, true /*canContainCyclicReference*/)) @@ -94,6 +95,7 @@ internal void InternalSerializeReference(XmlWriterDelegator xmlWriter, object ob OnEndHandleReference(xmlWriter, obj, true /*canContainCyclicReference*/); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal virtual void InternalSerialize(XmlWriterDelegator xmlWriter, object obj, bool isDeclaredType, bool writeXsiType, int declaredTypeID, RuntimeTypeHandle declaredTypeHandle) { if (writeXsiType) @@ -123,6 +125,7 @@ internal virtual void InternalSerialize(XmlWriterDelegator xmlWriter, object obj } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal void SerializeWithoutXsiType(DataContract dataContract, XmlWriterDelegator xmlWriter, object obj, RuntimeTypeHandle declaredTypeHandle) { if (OnHandleIsReference(xmlWriter, dataContract, obj)) @@ -139,6 +142,7 @@ internal void SerializeWithoutXsiType(DataContract dataContract, XmlWriterDelega } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal virtual void SerializeWithXsiTypeAtTopLevel(DataContract dataContract, XmlWriterDelegator xmlWriter, object obj, RuntimeTypeHandle originalDeclaredTypeHandle, Type graphType) { Debug.Assert(rootTypeDataContract != null); @@ -160,6 +164,7 @@ internal virtual void SerializeWithXsiTypeAtTopLevel(DataContract dataContract, SerializeAndVerifyType(dataContract, xmlWriter, obj, verifyKnownType, originalDeclaredTypeHandle, declaredType); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected virtual void SerializeWithXsiType(XmlWriterDelegator xmlWriter, object obj, RuntimeTypeHandle objectTypeHandle, Type? objectType, int declaredTypeID, RuntimeTypeHandle declaredTypeHandle, Type declaredType) { bool verifyKnownType = false; @@ -226,6 +231,7 @@ internal bool OnHandleIsReference(XmlWriterDelegator xmlWriter, DataContract con } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected void SerializeAndVerifyType(DataContract dataContract, XmlWriterDelegator xmlWriter, object obj, bool verifyKnownType, RuntimeTypeHandle declaredTypeHandle, Type declaredType) { bool knownTypesAddedInCurrentScope = false; @@ -285,6 +291,7 @@ internal virtual void WriteString(XmlWriterDelegator xmlWriter, string value) xmlWriter.WriteString(value); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal virtual void WriteString(XmlWriterDelegator xmlWriter, string? value, XmlDictionaryString name, XmlDictionaryString? ns) { if (value == null) @@ -302,6 +309,7 @@ internal virtual void WriteBase64(XmlWriterDelegator xmlWriter, byte[] value) xmlWriter.WriteBase64(value); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal virtual void WriteBase64(XmlWriterDelegator xmlWriter, byte[] value, XmlDictionaryString name, XmlDictionaryString ns) { if (value == null) @@ -319,6 +327,7 @@ internal virtual void WriteUri(XmlWriterDelegator xmlWriter, Uri value) xmlWriter.WriteUri(value); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal virtual void WriteUri(XmlWriterDelegator xmlWriter, Uri value, XmlDictionaryString name, XmlDictionaryString ns) { if (value == null) @@ -336,6 +345,7 @@ internal virtual void WriteQName(XmlWriterDelegator xmlWriter, XmlQualifiedName xmlWriter.WriteQName(value); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal virtual void WriteQName(XmlWriterDelegator xmlWriter, XmlQualifiedName? value, XmlDictionaryString name, XmlDictionaryString? ns) { if (value == null) @@ -385,12 +395,14 @@ internal virtual void OnEndHandleReference(XmlWriterDelegator xmlWriter, object } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal void WriteNull(XmlWriterDelegator xmlWriter, Type memberType, bool isMemberTypeSerializable) { CheckIfTypeSerializable(memberType, isMemberTypeSerializable); WriteNull(xmlWriter); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal void WriteNull(XmlWriterDelegator xmlWriter, Type memberType, bool isMemberTypeSerializable, XmlDictionaryString name, XmlDictionaryString? ns) { xmlWriter.WriteStartElement(name, ns); @@ -494,6 +506,7 @@ internal void GetObjectData(ISerializable obj, SerializationInfo serInfo, Stream obj.GetObjectData(serInfo, context); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public void WriteISerializable(XmlWriterDelegator xmlWriter, ISerializable obj) { Type objType = obj.GetType(); @@ -509,6 +522,7 @@ public void WriteISerializable(XmlWriterDelegator xmlWriter, ISerializable obj) WriteSerializationInfo(xmlWriter, objType, serInfo); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal void WriteSerializationInfo(XmlWriterDelegator xmlWriter, Type objType, SerializationInfo serInfo) { if (DataContract.GetClrTypeFullName(objType) != serInfo.FullTypeName) @@ -549,6 +563,7 @@ internal void WriteSerializationInfo(XmlWriterDelegator xmlWriter, Type objType, } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected virtual void WriteDataContractValue(DataContract dataContract, XmlWriterDelegator xmlWriter, object obj, RuntimeTypeHandle declaredTypeHandle) { dataContract.WriteXmlValue(xmlWriter, obj, this); @@ -559,6 +574,7 @@ protected virtual void WriteNull(XmlWriterDelegator xmlWriter) XmlObjectSerializer.WriteNull(xmlWriter); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void WriteResolvedTypeInfo(XmlWriterDelegator writer, Type objectType, Type declaredType) { XmlDictionaryString? typeName, typeNamespace; @@ -568,6 +584,7 @@ private void WriteResolvedTypeInfo(XmlWriterDelegator writer, Type objectType, T } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private bool ResolveType(Type objectType, Type declaredType, [NotNullWhen(true)] out XmlDictionaryString? typeName, [NotNullWhen(true)] out XmlDictionaryString? typeNamespace) { Debug.Assert(DataContractResolver != null); @@ -594,6 +611,7 @@ private bool ResolveType(Type objectType, Type declaredType, [NotNullWhen(true)] return true; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] protected virtual bool WriteTypeInfo(XmlWriterDelegator writer, DataContract contract, DataContract declaredContract) { if (!XmlObjectSerializer.IsContractDeclared(contract, declaredContract)) @@ -622,6 +640,7 @@ protected virtual void WriteTypeInfo(XmlWriterDelegator writer, XmlDictionaryStr writer.WriteAttributeQualifiedName(Globals.XsiPrefix, DictionaryGlobals.XsiTypeLocalName, DictionaryGlobals.SchemaInstanceNamespace, dataContractName, dataContractNamespace); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public void WriteExtensionData(XmlWriterDelegator xmlWriter, ExtensionDataObject? extensionData, int memberIndex) { if (IgnoreExtensionDataObject || extensionData == null) @@ -641,6 +660,7 @@ public void WriteExtensionData(XmlWriterDelegator xmlWriter, ExtensionDataObject } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void WriteExtensionDataMember(XmlWriterDelegator xmlWriter, ExtensionDataMember member) { xmlWriter.WriteStartElement(member.Name, member.Namespace); @@ -649,6 +669,7 @@ private void WriteExtensionDataMember(XmlWriterDelegator xmlWriter, ExtensionDat xmlWriter.WriteEndElement(); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal virtual void WriteExtensionDataTypeInfo(XmlWriterDelegator xmlWriter, IDataNode dataNode) { if (dataNode.DataContractName != null) @@ -657,6 +678,7 @@ internal virtual void WriteExtensionDataTypeInfo(XmlWriterDelegator xmlWriter, I WriteClrTypeInfo(xmlWriter, dataNode.DataType, dataNode.ClrTypeName, dataNode.ClrAssemblyName); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal void WriteExtensionDataValue(XmlWriterDelegator xmlWriter, IDataNode? dataNode) { IncrementItemCount(1); @@ -698,6 +720,7 @@ internal void WriteExtensionDataValue(XmlWriterDelegator xmlWriter, IDataNode? d OnEndHandleReference(xmlWriter, (dataNode.Value == null ? dataNode : dataNode.Value), true /*canContainCyclicReference*/); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal bool TryWriteDeserializedExtensionData(XmlWriterDelegator xmlWriter, IDataNode dataNode) { object? o = dataNode.Value; @@ -709,6 +732,7 @@ internal bool TryWriteDeserializedExtensionData(XmlWriterDelegator xmlWriter, ID return true; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void WriteExtensionClassData(XmlWriterDelegator xmlWriter, ClassDataNode dataNode) { if (!TryWriteDeserializedExtensionData(xmlWriter, dataNode)) @@ -726,6 +750,7 @@ private void WriteExtensionClassData(XmlWriterDelegator xmlWriter, ClassDataNode } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void WriteExtensionCollectionData(XmlWriterDelegator xmlWriter, CollectionDataNode dataNode) { if (!TryWriteDeserializedExtensionData(xmlWriter, dataNode)) @@ -747,6 +772,7 @@ private void WriteExtensionCollectionData(XmlWriterDelegator xmlWriter, Collecti } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void WriteExtensionISerializableData(XmlWriterDelegator xmlWriter, ISerializableDataNode dataNode) { if (!TryWriteDeserializedExtensionData(xmlWriter, dataNode)) @@ -770,6 +796,7 @@ private void WriteExtensionISerializableData(XmlWriterDelegator xmlWriter, ISeri } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void WriteExtensionXmlData(XmlWriterDelegator xmlWriter, XmlDataNode dataNode) { if (!TryWriteDeserializedExtensionData(xmlWriter, dataNode)) diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerWriteContextComplex.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerWriteContextComplex.cs index be3223aa661337..dfa8221e6829d7 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerWriteContextComplex.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XmlObjectSerializerWriteContextComplex.cs @@ -12,6 +12,7 @@ using System.Collections.Generic; using System.Security; using System.Runtime.CompilerServices; +using System.Diagnostics.CodeAnalysis; namespace System.Runtime.Serialization { @@ -60,6 +61,7 @@ internal override void WriteString(XmlWriterDelegator xmlWriter, string value) xmlWriter.WriteString(value); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override void WriteString(XmlWriterDelegator xmlWriter, string? value, XmlDictionaryString name, XmlDictionaryString? ns) { if (value == null) @@ -79,6 +81,7 @@ internal override void WriteBase64(XmlWriterDelegator xmlWriter, byte[] value) xmlWriter.WriteBase64(value); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override void WriteBase64(XmlWriterDelegator xmlWriter, byte[] value, XmlDictionaryString name, XmlDictionaryString ns) { if (value == null) @@ -98,6 +101,7 @@ internal override void WriteUri(XmlWriterDelegator xmlWriter, Uri value) xmlWriter.WriteUri(value); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override void WriteUri(XmlWriterDelegator xmlWriter, Uri value, XmlDictionaryString name, XmlDictionaryString ns) { if (value == null) @@ -117,6 +121,7 @@ internal override void WriteQName(XmlWriterDelegator xmlWriter, XmlQualifiedName xmlWriter.WriteQName(value); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override void WriteQName(XmlWriterDelegator xmlWriter, XmlQualifiedName? value, XmlDictionaryString name, XmlDictionaryString? ns) { if (value == null) @@ -133,6 +138,7 @@ internal override void WriteQName(XmlWriterDelegator xmlWriter, XmlQualifiedName } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override void InternalSerialize(XmlWriterDelegator xmlWriter, object obj, bool isDeclaredType, bool writeXsiType, int declaredTypeID, RuntimeTypeHandle declaredTypeHandle) { if (_serializationSurrogateProvider == null) @@ -170,6 +176,7 @@ internal override void OnEndHandleReference(XmlWriterDelegator xmlWriter, object base.OnEndHandleReference(xmlWriter, obj, canContainCyclicReference); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override void CheckIfTypeSerializable(Type memberType, bool isMemberTypeSerializable) { if (_serializationSurrogateProvider != null) @@ -185,6 +192,7 @@ internal override void CheckIfTypeSerializable(Type memberType, bool isMemberTyp base.CheckIfTypeSerializable(memberType, isMemberTypeSerializable); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] internal override Type GetSurrogatedType(Type type) { if (_serializationSurrogateProvider == null) @@ -207,6 +215,7 @@ internal override Type GetSurrogatedType(Type type) } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void InternalSerializeWithSurrogate(XmlWriterDelegator xmlWriter, object obj, bool isDeclaredType, bool writeXsiType, int declaredTypeID, RuntimeTypeHandle declaredTypeHandle) { RuntimeTypeHandle objTypeHandle = isDeclaredType ? declaredTypeHandle : obj.GetType().TypeHandle; diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XsdDataContractExporter.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XsdDataContractExporter.cs index 2ff80082ec9dce..0c18636e7846f7 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XsdDataContractExporter.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/XsdDataContractExporter.cs @@ -7,6 +7,7 @@ using System.Collections.ObjectModel; using System.Reflection; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; namespace System.Runtime.Serialization { @@ -72,6 +73,7 @@ private void TraceExportError(Exception exception) { } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public void Export(ICollection assemblies) { if (assemblies == null) @@ -103,6 +105,7 @@ public void Export(ICollection assemblies) TraceExportEnd(); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public void Export(ICollection types) { if (types == null) @@ -131,6 +134,7 @@ public void Export(ICollection types) TraceExportEnd(); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public void Export(Type type) { if (type == null) @@ -153,6 +157,7 @@ public void Export(Type type) TraceExportEnd(); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public XmlQualifiedName GetSchemaTypeName(Type type) { if (type == null) @@ -166,6 +171,7 @@ public XmlQualifiedName GetSchemaTypeName(Type type) return dataContract.StableName; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public XmlSchemaType? GetSchemaType(Type type) { if (type == null) @@ -179,6 +185,7 @@ public XmlQualifiedName GetSchemaTypeName(Type type) return null; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public XmlQualifiedName? GetRootElementName(Type type) { if (type == null) @@ -206,6 +213,7 @@ private Type GetSurrogatedType(Type type) return type; } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void CheckAndAddType(Type type) { type = GetSurrogatedType(type); @@ -213,11 +221,13 @@ private void CheckAndAddType(Type type) AddType(type); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void AddType(Type type) { DataContractSet.Add(type); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void Export() { AddKnownTypes(); @@ -225,6 +235,7 @@ private void Export() schemaExporter.Export(); } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] private void AddKnownTypes() { if (Options != null) @@ -244,6 +255,7 @@ private void AddKnownTypes() } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public bool CanExport(ICollection assemblies) { if (assemblies == null) @@ -277,6 +289,7 @@ public bool CanExport(ICollection assemblies) } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public bool CanExport(ICollection types) { if (types == null) @@ -307,6 +320,7 @@ public bool CanExport(ICollection types) } } + [RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)] public bool CanExport(Type type) { if (type == null) diff --git a/src/libraries/System.Runtime.Serialization.Json/ref/System.Runtime.Serialization.Json.cs b/src/libraries/System.Runtime.Serialization.Json/ref/System.Runtime.Serialization.Json.cs index 6781f4925fba07..014c498f6eace0 100644 --- a/src/libraries/System.Runtime.Serialization.Json/ref/System.Runtime.Serialization.Json.cs +++ b/src/libraries/System.Runtime.Serialization.Json/ref/System.Runtime.Serialization.Json.cs @@ -25,19 +25,19 @@ namespace System.Runtime.Serialization.Json { public sealed partial class DataContractJsonSerializer : System.Runtime.Serialization.XmlObjectSerializer { - [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Json Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public DataContractJsonSerializer(System.Type type) { } - [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Json Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public DataContractJsonSerializer(System.Type type, System.Collections.Generic.IEnumerable? knownTypes) { } - [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Json Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public DataContractJsonSerializer(System.Type type, System.Runtime.Serialization.Json.DataContractJsonSerializerSettings? settings) { } - [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Json Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public DataContractJsonSerializer(System.Type type, string? rootName) { } - [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Json Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public DataContractJsonSerializer(System.Type type, string? rootName, System.Collections.Generic.IEnumerable? knownTypes) { } - [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Json Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public DataContractJsonSerializer(System.Type type, System.Xml.XmlDictionaryString? rootName) { } - [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Json Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public DataContractJsonSerializer(System.Type type, System.Xml.XmlDictionaryString? rootName, System.Collections.Generic.IEnumerable? knownTypes) { } public System.Runtime.Serialization.DateTimeFormat? DateTimeFormat { get { throw null; } } public System.Runtime.Serialization.EmitTypeInformation EmitTypeInformation { get { throw null; } } @@ -46,21 +46,37 @@ public DataContractJsonSerializer(System.Type type, System.Xml.XmlDictionaryStri public int MaxItemsInObjectGraph { get { throw null; } } public bool SerializeReadOnlyTypes { get { throw null; } } public bool UseSimpleDictionaryFormat { get { throw null; } } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override bool IsStartObject(System.Xml.XmlDictionaryReader reader) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override bool IsStartObject(System.Xml.XmlReader reader) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override object? ReadObject(System.IO.Stream stream) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override object? ReadObject(System.Xml.XmlDictionaryReader reader) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override object? ReadObject(System.Xml.XmlDictionaryReader reader, bool verifyObjectName) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override object? ReadObject(System.Xml.XmlReader reader) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override object? ReadObject(System.Xml.XmlReader reader, bool verifyObjectName) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override void WriteEndObject(System.Xml.XmlDictionaryWriter writer) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override void WriteEndObject(System.Xml.XmlWriter writer) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override void WriteObject(System.IO.Stream stream, object? graph) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override void WriteObject(System.Xml.XmlDictionaryWriter writer, object? graph) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override void WriteObject(System.Xml.XmlWriter writer, object? graph) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override void WriteObjectContent(System.Xml.XmlDictionaryWriter writer, object? graph) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override void WriteObjectContent(System.Xml.XmlWriter writer, object? graph) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override void WriteStartObject(System.Xml.XmlDictionaryWriter writer, object? graph) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override void WriteStartObject(System.Xml.XmlWriter writer, object? graph) { } } public partial class DataContractJsonSerializerSettings diff --git a/src/libraries/System.Runtime.Serialization.Xml/ref/System.Runtime.Serialization.Xml.cs b/src/libraries/System.Runtime.Serialization.Xml/ref/System.Runtime.Serialization.Xml.cs index 4c16924a5e8271..6a3d406d810269 100644 --- a/src/libraries/System.Runtime.Serialization.Xml/ref/System.Runtime.Serialization.Xml.cs +++ b/src/libraries/System.Runtime.Serialization.Xml/ref/System.Runtime.Serialization.Xml.cs @@ -9,7 +9,9 @@ namespace System.Runtime.Serialization public abstract partial class DataContractResolver { protected DataContractResolver() { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public abstract System.Type? ResolveName(string typeName, string? typeNamespace, System.Type? declaredType, System.Runtime.Serialization.DataContractResolver knownTypeResolver); + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public abstract bool TryResolveType(System.Type type, System.Type? declaredType, System.Runtime.Serialization.DataContractResolver knownTypeResolver, out System.Xml.XmlDictionaryString? typeName, out System.Xml.XmlDictionaryString? typeNamespace); } public sealed partial class DataContractSerializer : System.Runtime.Serialization.XmlObjectSerializer @@ -27,19 +29,33 @@ public DataContractSerializer(System.Type type, System.Xml.XmlDictionaryString r public int MaxItemsInObjectGraph { get { throw null; } } public bool PreserveObjectReferences { get { throw null; } } public bool SerializeReadOnlyTypes { get { throw null; } } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override bool IsStartObject(System.Xml.XmlDictionaryReader reader) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override bool IsStartObject(System.Xml.XmlReader reader) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override object? ReadObject(System.Xml.XmlDictionaryReader reader, bool verifyObjectName) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public object? ReadObject(System.Xml.XmlDictionaryReader reader, bool verifyObjectName, System.Runtime.Serialization.DataContractResolver? dataContractResolver) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override object? ReadObject(System.Xml.XmlReader reader) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override object? ReadObject(System.Xml.XmlReader reader, bool verifyObjectName) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override void WriteEndObject(System.Xml.XmlDictionaryWriter writer) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override void WriteEndObject(System.Xml.XmlWriter writer) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public void WriteObject(System.Xml.XmlDictionaryWriter writer, object? graph, System.Runtime.Serialization.DataContractResolver? dataContractResolver) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override void WriteObject(System.Xml.XmlWriter writer, object? graph) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override void WriteObjectContent(System.Xml.XmlDictionaryWriter writer, object? graph) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override void WriteObjectContent(System.Xml.XmlWriter writer, object? graph) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override void WriteStartObject(System.Xml.XmlDictionaryWriter writer, object? graph) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public override void WriteStartObject(System.Xml.XmlWriter writer, object? graph) { } } public static partial class DataContractSerializerExtensions @@ -75,21 +91,37 @@ public partial interface IExtensibleDataObject public abstract partial class XmlObjectSerializer { protected XmlObjectSerializer() { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public abstract bool IsStartObject(System.Xml.XmlDictionaryReader reader); + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public virtual bool IsStartObject(System.Xml.XmlReader reader) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public virtual object? ReadObject(System.IO.Stream stream) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public virtual object? ReadObject(System.Xml.XmlDictionaryReader reader) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public abstract object? ReadObject(System.Xml.XmlDictionaryReader reader, bool verifyObjectName); + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public virtual object? ReadObject(System.Xml.XmlReader reader) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public virtual object? ReadObject(System.Xml.XmlReader reader, bool verifyObjectName) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public abstract void WriteEndObject(System.Xml.XmlDictionaryWriter writer); + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public virtual void WriteEndObject(System.Xml.XmlWriter writer) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public virtual void WriteObject(System.IO.Stream stream, object? graph) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public virtual void WriteObject(System.Xml.XmlDictionaryWriter writer, object? graph) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public virtual void WriteObject(System.Xml.XmlWriter writer, object? graph) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public abstract void WriteObjectContent(System.Xml.XmlDictionaryWriter writer, object? graph); + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public virtual void WriteObjectContent(System.Xml.XmlWriter writer, object? graph) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public abstract void WriteStartObject(System.Xml.XmlDictionaryWriter writer, object? graph); + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public virtual void WriteStartObject(System.Xml.XmlWriter writer, object? graph) { } } public static partial class XmlSerializableServices @@ -100,7 +132,9 @@ public static void WriteNodes(System.Xml.XmlWriter xmlWriter, System.Xml.XmlNode } public static partial class XPathQueryGenerator { + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public static string CreateFromDataContractSerializer(System.Type type, System.Reflection.MemberInfo[] pathToMember, System.Text.StringBuilder? rootElementXpath, out System.Xml.XmlNamespaceManager namespaces) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public static string CreateFromDataContractSerializer(System.Type type, System.Reflection.MemberInfo[] pathToMember, out System.Xml.XmlNamespaceManager namespaces) { throw null; } } public partial class XsdDataContractExporter @@ -109,14 +143,23 @@ public XsdDataContractExporter() { } public XsdDataContractExporter(System.Xml.Schema.XmlSchemaSet? schemas) { } public System.Runtime.Serialization.ExportOptions? Options { get { throw null; } set { } } public System.Xml.Schema.XmlSchemaSet Schemas { get { throw null; } } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public bool CanExport(System.Collections.Generic.ICollection assemblies) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public bool CanExport(System.Collections.Generic.ICollection types) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public bool CanExport(System.Type type) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public void Export(System.Collections.Generic.ICollection assemblies) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public void Export(System.Collections.Generic.ICollection types) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public void Export(System.Type type) { } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public System.Xml.XmlQualifiedName? GetRootElementName(System.Type type) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public System.Xml.Schema.XmlSchemaType? GetSchemaType(System.Type type) { throw null; } + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Data Contract Serialization and Deserialization might require types that cannot be statically analyzed. Make sure all of the required types are preserved.")] public System.Xml.XmlQualifiedName GetSchemaTypeName(System.Type type) { throw null; } } }