Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Address remaining warnings from DataContractSerialization #51200

Merged
10 commits merged into from
Apr 19, 2021

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@

using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Threading.Tasks;

Expand All @@ -23,12 +25,14 @@ 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)!;

[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
public static Func<object> GetMakeNewInstanceFunc(Type type)
{
Func<object> make = s_make.MakeGenericMethod(type).CreateDelegate<Func<object>>();
return make;
}

[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
public static Getter CreateGetter(MemberInfo memberInfo)
{
if (memberInfo is PropertyInfo propInfo)
Expand All @@ -51,6 +55,7 @@ public static Getter CreateGetter(MemberInfo memberInfo)
}
}

[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
public static Setter CreateSetter(MemberInfo memberInfo)
{
if (memberInfo is PropertyInfo)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ namespace System.Runtime.Serialization
using DataContractDictionary = System.Collections.Generic.Dictionary<System.Xml.XmlQualifiedName, DataContract>;
using System.Linq;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.Serialization.Json;

internal sealed class ClassDataContract : DataContract
{
Expand All @@ -33,11 +34,13 @@ internal sealed class ClassDataContract : DataContract

private bool _isScriptObject;

[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
internal ClassDataContract(Type type) : base(new ClassDataContractCriticalHelper(type))
{
InitClassDataContract();
}

[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
private ClassDataContract(Type type, XmlDictionaryString ns, string[] memberNames) : base(new ClassDataContractCriticalHelper(type, ns, memberNames))
{
InitClassDataContract();
Expand Down Expand Up @@ -65,6 +68,7 @@ internal List<DataMember>? Members

public XmlDictionaryString?[]? ChildElementNamespaces
{
[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
get
{
if (_childElementNamespaces == null)
Expand Down Expand Up @@ -122,6 +126,7 @@ internal MethodInfo? ExtensionDataSetMethod

public override DataContractDictionary? KnownDataContracts
{
[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
get
{ return _helper.KnownDataContracts; }
}
Expand Down Expand Up @@ -195,6 +200,7 @@ internal MethodInfo? GetKeyValuePairMethodInfo
private Func<object>? _makeNewInstance;
private Func<object> MakeNewInstance
{
[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
get
{
if (_makeNewInstance == null)
Expand All @@ -206,6 +212,7 @@ private Func<object> MakeNewInstance
}
}

[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
internal bool CreateNewInstanceViaDefaultConstructor([NotNullWhen(true)] out object? obj)
{
ConstructorInfo? ci = GetNonAttributedTypeConstructor();
Expand All @@ -228,13 +235,15 @@ internal bool CreateNewInstanceViaDefaultConstructor([NotNullWhen(true)] out obj
return true;
}

[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
private XmlFormatClassWriterDelegate CreateXmlFormatWriterDelegate()
{
return new XmlFormatWriterGenerator().GenerateClassWriter(this);
}

internal XmlFormatClassWriterDelegate XmlFormatWriterDelegate
{
[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
get
{
if (_helper.XmlFormatWriterDelegate == null)
Expand All @@ -256,13 +265,15 @@ internal XmlFormatClassWriterDelegate XmlFormatWriterDelegate
}
}

[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
private XmlFormatClassReaderDelegate CreateXmlFormatReaderDelegate()
{
return new XmlFormatReaderGenerator().GenerateClassReader(this);
}

internal XmlFormatClassReaderDelegate XmlFormatReaderDelegate
{
[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
get
{
if (_helper.XmlFormatReaderDelegate == null)
Expand All @@ -284,6 +295,7 @@ internal XmlFormatClassReaderDelegate XmlFormatReaderDelegate
}
}

[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
internal static ClassDataContract CreateClassDataContractForKeyValue(Type type, XmlDictionaryString ns, string[] memberNames)
{
ClassDataContract? cdc = (ClassDataContract?)DataContract.GetDataContractFromGeneratedAssembly(type);
Expand Down Expand Up @@ -317,6 +329,7 @@ internal static void CheckAndAddMember(List<DataMember> members, DataMember memb
members.Add(memberContract);
}

[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
internal static XmlDictionaryString? GetChildNamespaceToDeclare(DataContract dataContract, Type childType, XmlDictionary dictionary)
{
childType = DataContract.UnwrapNullableType(childType);
Expand All @@ -342,7 +355,9 @@ private static bool IsArraySegment(Type t)
/// is therefore marked SRR
/// Safe - does not let caller influence isNonAttributedType calculation; no harm in leaking value
/// </SecurityNote>
internal static bool IsNonAttributedTypeValidForSerialization(Type type)
internal static bool IsNonAttributedTypeValidForSerialization(
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)]
Type type)
{
if (type.IsArray)
return false;
Expand Down Expand Up @@ -437,6 +452,7 @@ internal static bool IsNonSerializedMember(Type type, string memberName)
&& members.Contains(memberName);
}

[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
private XmlDictionaryString?[]? CreateChildElementNamespaces()
{
if (Members == null)
Expand Down Expand Up @@ -464,6 +480,7 @@ private void EnsureMethodsImported()
_helper.EnsureMethodsImported();
}

[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
public override void WriteXmlValue(XmlWriterDelegator xmlWriter, object obj, XmlObjectSerializerWriteContext? context)
{
Debug.Assert(context != null);
Expand All @@ -475,6 +492,7 @@ public override void WriteXmlValue(XmlWriterDelegator xmlWriter, object obj, Xml
XmlFormatWriterDelegate(xmlWriter, obj, context, this);
}

[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
public override object? ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext? context)
{
if (_isScriptObject)
Expand Down Expand Up @@ -711,7 +729,13 @@ private sealed class ClassDataContractCriticalHelper : DataContract.DataContract
public XmlDictionaryString[]? MemberNames;
public XmlDictionaryString[]? MemberNamespaces;

internal ClassDataContractCriticalHelper(Type type) : base(type)
[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
internal ClassDataContractCriticalHelper([DynamicallyAccessedMembers(
DynamicallyAccessedMemberTypes.PublicMethods |
DynamicallyAccessedMemberTypes.NonPublicMethods |
DynamicallyAccessedMemberTypes.PublicConstructors |
DynamicallyAccessedMemberTypes.NonPublicConstructors)]
Type type) : base(type)
{
XmlQualifiedName stableName = GetStableNameAndSetHasDataContract(type);
if (type == Globals.TypeOfDBNull)
Expand Down Expand Up @@ -823,7 +847,14 @@ internal ClassDataContractCriticalHelper(Type type) : base(type)
Globals.TypeOfScriptObject_IsAssignableFrom(this.UnderlyingType);
}

internal ClassDataContractCriticalHelper(Type type, XmlDictionaryString ns, string[] memberNames) : base(type)
[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
internal ClassDataContractCriticalHelper(
[DynamicallyAccessedMembers(
DynamicallyAccessedMemberTypes.PublicConstructors |
DynamicallyAccessedMemberTypes.NonPublicConstructors |
DynamicallyAccessedMemberTypes.PublicMethods |
DynamicallyAccessedMemberTypes.NonPublicMethods)]
Type type, XmlDictionaryString ns, string[] memberNames) : base(type)
{
this.StableName = new XmlQualifiedName(GetStableNameAndSetHasDataContract(type).Name, ns.Value);
ImportDataMembers();
Expand Down Expand Up @@ -896,6 +927,7 @@ private void EnsureIsReferenceImported(Type type)

[MemberNotNull(nameof(_members))]
[MemberNotNull(nameof(Members))]
[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
private void ImportDataMembers()
{
Type type = this.UnderlyingType;
Expand Down Expand Up @@ -1075,6 +1107,7 @@ private static bool CanSerializeMember(FieldInfo? field)
return field != null && !ClassDataContract.IsNonSerializedMember(field.DeclaringType!, field.Name);
}

[RequiresUnreferencedCode(DataContractJsonSerializer.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
Expand Down Expand Up @@ -1148,6 +1181,7 @@ private void SetIfMembersHaveConflict(List<DataMember> members)
}
}

[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
private XmlQualifiedName GetStableNameAndSetHasDataContract(Type type)
{
return DataContract.GetStableName(type, out _hasDataContract);
Expand All @@ -1160,7 +1194,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
/// </SecurityNote>
private void SetIsNonAttributedType(Type type)
private void SetIsNonAttributedType(
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)]
Type type)
{
_isNonAttributedType = !type.IsSerializable && !_hasDataContract && IsNonAttributedTypeValidForSerialization(type);
}
Expand Down Expand Up @@ -1314,6 +1350,8 @@ internal MethodInfo? ExtensionDataSetMethod

internal override DataContractDictionary? KnownDataContracts
{

[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
get
{
if (_knownDataContracts != null)
Expand Down Expand Up @@ -1362,7 +1400,14 @@ internal bool IsNonAttributedType
get { return _isNonAttributedType; }
}

private void SetKeyValuePairAdapterFlags(Type type)
[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
private void SetKeyValuePairAdapterFlags(
[DynamicallyAccessedMembers(
DynamicallyAccessedMemberTypes.PublicMethods |
DynamicallyAccessedMemberTypes.NonPublicMethods |
DynamicallyAccessedMemberTypes.PublicConstructors |
DynamicallyAccessedMemberTypes.NonPublicConstructors)]
Type type)
{
if (type.IsGenericType && type.GetGenericTypeDefinition() == Globals.TypeOfKeyValuePairAdapter)
{
Expand Down Expand Up @@ -1491,6 +1536,7 @@ public int Compare(Member x, Member y)
internal static DataMemberConflictComparer Singleton = new DataMemberConflictComparer();
}

[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
internal ClassDataContractCriticalHelper Clone()
{
ClassDataContractCriticalHelper clonedHelper = new ClassDataContractCriticalHelper(this.UnderlyingType);
Expand Down Expand Up @@ -1552,6 +1598,7 @@ internal Type ObjectType
}
}

[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
internal ClassDataContract Clone()
{
ClassDataContract clonedDc = new ClassDataContract(this.UnderlyingType);
Expand All @@ -1565,6 +1612,7 @@ internal ClassDataContract Clone()
return clonedDc;
}

[RequiresUnreferencedCode(DataContractJsonSerializer.SerializerTrimmerWarning)]
internal void UpdateNamespaceAndMembers(Type type, XmlDictionaryString ns, string[] memberNames)
{
this.StableName = new XmlQualifiedName(GetStableName(type).Name, ns.Value);
Expand Down
Loading