From 271ad8aebd9cc8a496d165933c80c3722d1b56f8 Mon Sep 17 00:00:00 2001 From: Mike-EEE Date: Thu, 28 Nov 2019 05:30:51 -0500 Subject: [PATCH 1/3] Removed dependency to System.Reflection.Emit.Lightweight. --- .../Collections/MappedArraySerializers.cs | 24 ++--------- .../Collections/MappedArraySpecification.cs | 41 +++++++++---------- .../ExtendedXmlSerializer.csproj | 2 +- 3 files changed, 24 insertions(+), 43 deletions(-) diff --git a/src/ExtendedXmlSerializer/ContentModel/Collections/MappedArraySerializers.cs b/src/ExtendedXmlSerializer/ContentModel/Collections/MappedArraySerializers.cs index 5882b67b9..3a35bf1eb 100644 --- a/src/ExtendedXmlSerializer/ContentModel/Collections/MappedArraySerializers.cs +++ b/src/ExtendedXmlSerializer/ContentModel/Collections/MappedArraySerializers.cs @@ -8,7 +8,7 @@ using System.Collections.Immutable; using System.Linq; using System.Reflection; -using System.Reflection.Emit; +using System.Runtime.CompilerServices; namespace ExtendedXmlSerializer.ContentModel.Collections { @@ -16,10 +16,7 @@ sealed class MappedArraySerializers : IContents { readonly IContents _contents; - public MappedArraySerializers(IContents contents) - { - _contents = contents; - } + public MappedArraySerializers(IContents contents) => _contents = contents; public ISerializer Get(TypeInfo parameter) { @@ -53,25 +50,12 @@ public void Write(IFormatWriter writer, Array instance) } } - sealed class SizeOf : ISource + sealed class SizeOf : DelegatedSource { [UsedImplicitly] public static SizeOf Default { get; } = new SizeOf(); - SizeOf() {} - - public int Get() - { - var dm = new DynamicMethod("func", typeof(int), Type.EmptyTypes); - - ILGenerator il = dm.GetILGenerator(); - il.Emit(OpCodes.Sizeof, typeof(T)); - il.Emit(OpCodes.Ret); - - var factory = (Func)dm.CreateDelegate(typeof(Func)); - var result = factory(); - return result; - } + SizeOf() : base(Unsafe.SizeOf) {} } sealed class Sizes : StructureCache diff --git a/src/ExtendedXmlSerializer/ContentModel/Collections/MappedArraySpecification.cs b/src/ExtendedXmlSerializer/ContentModel/Collections/MappedArraySpecification.cs index f7fb24016..9fda2ca81 100644 --- a/src/ExtendedXmlSerializer/ContentModel/Collections/MappedArraySpecification.cs +++ b/src/ExtendedXmlSerializer/ContentModel/Collections/MappedArraySpecification.cs @@ -1,23 +1,20 @@ -using System.Reflection; -using ExtendedXmlSerializer.Core.Specifications; -using ExtendedXmlSerializer.ReflectionModel; - -namespace ExtendedXmlSerializer.ContentModel.Collections -{ - sealed class MappedArraySpecification : ISpecification - { - public static MappedArraySpecification Default { get; } = new MappedArraySpecification(); - - readonly ISpecification _specification; - - public MappedArraySpecification() : this(IsValueTypeSpecification.Default) {} - - public MappedArraySpecification(ISpecification specification) - { - _specification = specification; - } - - public bool IsSatisfiedBy(TypeInfo parameter) => parameter.GetArrayRank() > 1 && - _specification.IsSatisfiedBy(parameter.GetElementType()); - } +using System.Reflection; +using ExtendedXmlSerializer.Core.Specifications; +using ExtendedXmlSerializer.ReflectionModel; + +namespace ExtendedXmlSerializer.ContentModel.Collections +{ + sealed class MappedArraySpecification : ISpecification + { + public static MappedArraySpecification Default { get; } = new MappedArraySpecification(); + + readonly ISpecification _specification; + + public MappedArraySpecification() : this(IsValueTypeSpecification.Default) {} + + public MappedArraySpecification(ISpecification specification) => _specification = specification; + + public bool IsSatisfiedBy(TypeInfo parameter) => parameter.GetArrayRank() > 1 && + _specification.IsSatisfiedBy(parameter.GetElementType()); + } } \ No newline at end of file diff --git a/src/ExtendedXmlSerializer/ExtendedXmlSerializer.csproj b/src/ExtendedXmlSerializer/ExtendedXmlSerializer.csproj index 0bf1a1367..6e6cf1f91 100644 --- a/src/ExtendedXmlSerializer/ExtendedXmlSerializer.csproj +++ b/src/ExtendedXmlSerializer/ExtendedXmlSerializer.csproj @@ -56,7 +56,7 @@ - + \ No newline at end of file From 11dc9eb34bc52fac0448fbd4b0bfd2c18f7d8593 Mon Sep 17 00:00:00 2001 From: Mike-EEE Date: Thu, 28 Nov 2019 08:59:13 -0500 Subject: [PATCH 2/3] Exception check for UWP-based scenarios. (*sigh*) --- .../ExtensionModel/Xml/DefaultMemberOrder.cs | 26 ++++++++++++++++--- .../ExtensionModel/Xml/Members.cs | 14 ++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 src/ExtendedXmlSerializer/ExtensionModel/Xml/Members.cs diff --git a/src/ExtendedXmlSerializer/ExtensionModel/Xml/DefaultMemberOrder.cs b/src/ExtendedXmlSerializer/ExtensionModel/Xml/DefaultMemberOrder.cs index 07cf0e886..d8cb4dad7 100644 --- a/src/ExtendedXmlSerializer/ExtensionModel/Xml/DefaultMemberOrder.cs +++ b/src/ExtendedXmlSerializer/ExtensionModel/Xml/DefaultMemberOrder.cs @@ -1,9 +1,11 @@ using ExtendedXmlSerializer.Core.Sources; +using System; +using System.Collections.Generic; using System.Reflection; using System.Xml.Serialization; namespace ExtendedXmlSerializer.ExtensionModel.Xml -{ +{ /// /// Default order selector that looks for a and if not specified, uses the . /// @@ -14,10 +16,28 @@ public sealed class DefaultMemberOrder : IParameterizedSource /// public static DefaultMemberOrder Default { get; } = new DefaultMemberOrder(); - DefaultMemberOrder() {} + DefaultMemberOrder() : this(Members.Default) {} + + + readonly IParameterizedSource> _members; + + /// + public DefaultMemberOrder(IParameterizedSource> members) => _members = members; /// public int Get(MemberInfo parameter) - => DefaultXmlElementAttribute.Default.Get(parameter)?.Order ?? parameter.MetadataToken; + => DefaultXmlElementAttribute.Default.Get(parameter)?.Order ?? Resolve(parameter); + + int Resolve(MemberInfo parameter) + { + try + { + return parameter.MetadataToken; + } + catch (InvalidOperationException) // UWP Throws, because UWP: https://github.com/ExtendedXmlSerializer/home/issues/269#issuecomment-559485714 + { + return _members.Get(parameter).IndexOf(parameter); + } + } } } \ No newline at end of file diff --git a/src/ExtendedXmlSerializer/ExtensionModel/Xml/Members.cs b/src/ExtendedXmlSerializer/ExtensionModel/Xml/Members.cs new file mode 100644 index 000000000..4a3c3d4bd --- /dev/null +++ b/src/ExtendedXmlSerializer/ExtensionModel/Xml/Members.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using ExtendedXmlSerializer.Core.Sources; + +namespace ExtendedXmlSerializer.ExtensionModel.Xml +{ + sealed class Members : ReferenceCache> + { + public static Members Default { get; } = new Members(); + + Members() : base(x => x.ReflectedType.GetMembers().ToList()) {} + } +} \ No newline at end of file From 7454ca3bd5385790a72a9c1c73cda48e4feb16e7 Mon Sep 17 00:00:00 2001 From: Mike-EEE Date: Thu, 28 Nov 2019 10:43:00 -0500 Subject: [PATCH 3/3] Improved default ordering in the case its default scenario fails. --- .../ExtensionModel/Xml/DefaultMemberOrder.cs | 18 +++++++++++------- .../ExtensionModel/Xml/Members.cs | 11 +++++++---- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/ExtendedXmlSerializer/ExtensionModel/Xml/DefaultMemberOrder.cs b/src/ExtendedXmlSerializer/ExtensionModel/Xml/DefaultMemberOrder.cs index d8cb4dad7..d2724707b 100644 --- a/src/ExtendedXmlSerializer/ExtensionModel/Xml/DefaultMemberOrder.cs +++ b/src/ExtendedXmlSerializer/ExtensionModel/Xml/DefaultMemberOrder.cs @@ -16,17 +16,21 @@ public sealed class DefaultMemberOrder : IParameterizedSource /// public static DefaultMemberOrder Default { get; } = new DefaultMemberOrder(); - DefaultMemberOrder() : this(Members.Default) {} + DefaultMemberOrder() : this(DefaultXmlElementAttribute.Default.Get, Members.Default.Get) {} - - readonly IParameterizedSource> _members; + readonly Func _attribute; + readonly Func> _members; /// - public DefaultMemberOrder(IParameterizedSource> members) => _members = members; + public DefaultMemberOrder(Func attribute, + Func> members) + { + _attribute = attribute; + _members = members; + } /// - public int Get(MemberInfo parameter) - => DefaultXmlElementAttribute.Default.Get(parameter)?.Order ?? Resolve(parameter); + public int Get(MemberInfo parameter) => _attribute(parameter)?.Order ?? Resolve(parameter); int Resolve(MemberInfo parameter) { @@ -36,7 +40,7 @@ int Resolve(MemberInfo parameter) } catch (InvalidOperationException) // UWP Throws, because UWP: https://github.com/ExtendedXmlSerializer/home/issues/269#issuecomment-559485714 { - return _members.Get(parameter).IndexOf(parameter); + return _members(parameter).IndexOf(parameter); } } } diff --git a/src/ExtendedXmlSerializer/ExtensionModel/Xml/Members.cs b/src/ExtendedXmlSerializer/ExtensionModel/Xml/Members.cs index 4a3c3d4bd..341fe70f0 100644 --- a/src/ExtendedXmlSerializer/ExtensionModel/Xml/Members.cs +++ b/src/ExtendedXmlSerializer/ExtensionModel/Xml/Members.cs @@ -1,14 +1,17 @@ -using System.Collections.Generic; +using ExtendedXmlSerializer.Core.Sources; +using System; +using System.Collections.Generic; using System.Linq; using System.Reflection; -using ExtendedXmlSerializer.Core.Sources; namespace ExtendedXmlSerializer.ExtensionModel.Xml { - sealed class Members : ReferenceCache> + sealed class Members : ReferenceCache>, IParameterizedSource> { public static Members Default { get; } = new Members(); - Members() : base(x => x.ReflectedType.GetMembers().ToList()) {} + Members() : base(x => x.GetMembers().ToList()) {} + + public List Get(MemberInfo parameter) => base.Get(parameter.ReflectedType); } } \ No newline at end of file