From 33a573bfd0d23b5063d2cc4fec0f00d215c3f3e3 Mon Sep 17 00:00:00 2001 From: Marko Hilmert Date: Wed, 20 Mar 2024 11:11:01 +0100 Subject: [PATCH 1/3] Fixed Deserialization of inherited class with different namespaces not possible with Migration (Issue 612) --- .../ExtensionModel/Xml/MigrationsExtension.cs | 25 ++-- .../Issue612Tests.cs | 108 ++++++++++++++++++ 2 files changed, 123 insertions(+), 10 deletions(-) create mode 100644 test/ExtendedXmlSerializer.Tests.ReportedIssues/Issue612Tests.cs diff --git a/src/ExtendedXmlSerializer/ExtensionModel/Xml/MigrationsExtension.cs b/src/ExtendedXmlSerializer/ExtensionModel/Xml/MigrationsExtension.cs index 61beea42..b731eee7 100644 --- a/src/ExtendedXmlSerializer/ExtensionModel/Xml/MigrationsExtension.cs +++ b/src/ExtendedXmlSerializer/ExtensionModel/Xml/MigrationsExtension.cs @@ -136,16 +136,21 @@ public IFormatReader Get(IFormatReader parameter) foreach (var attribute in attributes) { - var prefix = attribute.Name.LocalName; - if (manager.LookupNamespace(prefix) == null) - { - var @namespace = element.GetNamespaceOfPrefix(prefix); - if (@namespace != null) - { - manager.AddNamespace(prefix, @namespace.NamespaceName); - } - } - } + var prefix = attribute.Name.LocalName; + if (prefix == "xmlns") + { + //Add default namespace to the manager + manager.AddNamespace(string.Empty, attribute.Value); + } + else if (manager.LookupNamespace(prefix) == null) + { + var @namespace = element.GetNamespaceOfPrefix(prefix); + if (@namespace != null) + { + manager.AddNamespace(prefix, @namespace.NamespaceName); + } + } + } } XmlParserContexts.Default.Assign(native.NameTable, context); diff --git a/test/ExtendedXmlSerializer.Tests.ReportedIssues/Issue612Tests.cs b/test/ExtendedXmlSerializer.Tests.ReportedIssues/Issue612Tests.cs new file mode 100644 index 00000000..bd815c41 --- /dev/null +++ b/test/ExtendedXmlSerializer.Tests.ReportedIssues/Issue612Tests.cs @@ -0,0 +1,108 @@ +using ExtendedXmlSerializer.Configuration; +using ExtendedXmlSerializer.Tests.ReportedIssues.Support; +using FluentAssertions; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Xml.Linq; +using Xunit; + +namespace ExtendedXmlSerializer.Tests.ReportedIssues +{ + public sealed class Issue612Tests + { + [Fact] + public void Verify() + { + var serializer = new ConfigurationContainer().Type() + .AddMigration(EmptyMigration.Default) + .Create() + .ForTesting(); + + var container = new BaseNamespace.Container(); + container.Content.Add(new InheritNamespace.Inherit() { Check = new InheritNamespace.InheritCheck() }); + serializer.Cycle(container).Should().BeEquivalentTo(container); + } + + [Fact] + public void VerifyWithoutMigration() + { + var serializer = new ConfigurationContainer().Type() + .Create() + .ForTesting(); + + var container = new BaseNamespace.Container(); + container.Content.Add(new InheritNamespace.Inherit() { Check = new InheritNamespace.InheritCheck() }); + serializer.Cycle(container).Should().BeEquivalentTo(container); + } + + [Fact] + public void VerifyComplex() + { + var serializer = new ConfigurationContainer().Type() + .AddMigration(EmptyMigration.Default) + .Create() + .ForTesting(); + + var container = new BaseNamespace.Container(); + container.Content.Add(new BaseNamespace.Base() { Check = new BaseNamespace.BaseCheck() }); + container.Content.Add(new InheritNamespace.Inherit() { Check = new InheritNamespace.InheritCheck() }); + container.Content.Add(new InheritNamespace.Inherit() { Check = new BaseNamespace.BaseCheck() }); + serializer.Cycle(container).Should().BeEquivalentTo(container); + } + + [Fact] + public void VerifyComplexWithoutMigration() + { + var serializer = new ConfigurationContainer().Type() + .Create() + .ForTesting(); + + var container = new BaseNamespace.Container(); + container.Content.Add(new BaseNamespace.Base() { Check = new BaseNamespace.BaseCheck() }); + container.Content.Add(new InheritNamespace.Inherit() { Check = new InheritNamespace.InheritCheck() }); + container.Content.Add(new InheritNamespace.Inherit() { Check = new BaseNamespace.BaseCheck() }); + serializer.Cycle(container).Should().BeEquivalentTo(container); + } + + } + sealed class EmptyMigration : IEnumerable> + { + public static EmptyMigration Default { get; } = new EmptyMigration(); + + EmptyMigration() { } + + public IEnumerator> GetEnumerator() + { + yield break; + } + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + } +} + +namespace BaseNamespace +{ + + public class Container + { + public List Content { get; set; } = new List(); + } + + public class Base + { + public BaseCheck Check { get; set; } + } + public class BaseCheck { } +} + +namespace InheritNamespace +{ + + public class Inherit : BaseNamespace.Base { } + + + public class InheritCheck : BaseNamespace.BaseCheck { } + +} + From 7c624f19f620a23b456c6c015b2a0676703bb9b7 Mon Sep 17 00:00:00 2001 From: Marko Hilmert Date: Wed, 20 Mar 2024 14:54:49 +0100 Subject: [PATCH 2/3] Fixed Issue 613 with ReaderFormatter returning wrong object name --- .../ExtensionModel/Xml/ReaderFormatter.cs | 2 +- .../Issue613Tests.cs | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 test/ExtendedXmlSerializer.Tests.ReportedIssues/Issue613Tests.cs diff --git a/src/ExtendedXmlSerializer/ExtensionModel/Xml/ReaderFormatter.cs b/src/ExtendedXmlSerializer/ExtensionModel/Xml/ReaderFormatter.cs index a573bfd6..34d4af3c 100644 --- a/src/ExtendedXmlSerializer/ExtensionModel/Xml/ReaderFormatter.cs +++ b/src/ExtendedXmlSerializer/ExtensionModel/Xml/ReaderFormatter.cs @@ -8,6 +8,6 @@ sealed class ReaderFormatter : IReaderFormatter ReaderFormatter() {} - public string Get(IFormatReader parameter) => ((System.Xml.XmlReader)parameter.Get()).Name; + public string Get(IFormatReader parameter) => ((System.Xml.XmlReader)parameter.Get()).LocalName; } } \ No newline at end of file diff --git a/test/ExtendedXmlSerializer.Tests.ReportedIssues/Issue613Tests.cs b/test/ExtendedXmlSerializer.Tests.ReportedIssues/Issue613Tests.cs new file mode 100644 index 00000000..550563ba --- /dev/null +++ b/test/ExtendedXmlSerializer.Tests.ReportedIssues/Issue613Tests.cs @@ -0,0 +1,39 @@ +using ExtendedXmlSerializer.Configuration; +using ExtendedXmlSerializer.Tests.ReportedIssues.Support; +using FluentAssertions; +using Xunit; + +namespace ExtendedXmlSerializer.Tests.ReportedIssues +{ + public sealed class Issue613Tests + { + [Fact] + public void Verify() + { + var serializer = new ConfigurationContainer().Type() + .AddMigration(EmptyMigration.Default) + .Create() + .ForTesting(); + + var container = new BaseNamespace.Container(); + container.Content.Add(new InheritNamespace.Inherit() { Check = new BaseNamespace.BaseCheck() }); + container.Content.Add(new BaseNamespace.Base() { Check = new InheritNamespace.InheritCheck() }); + serializer.Cycle(container).Should().BeEquivalentTo(container); + } + + [Fact] + public void VerifyWithoutMigration() + { + var serializer = new ConfigurationContainer().Type() + .Create() + .ForTesting(); + + var container = new BaseNamespace.Container(); + container.Content.Add(new InheritNamespace.Inherit() { Check = new BaseNamespace.BaseCheck() }); + container.Content.Add(new BaseNamespace.Base() { Check = new InheritNamespace.InheritCheck() }); + serializer.Cycle(container).Should().BeEquivalentTo(container); + } + + } +} + From a96a998a896b24c851935f121181e9a0e5d1e589 Mon Sep 17 00:00:00 2001 From: Marko Hilmert Date: Wed, 20 Mar 2024 15:03:44 +0100 Subject: [PATCH 3/3] Updated test class name to correct issue number --- .../{Issue613Tests.cs => Issue614Tests.cs} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename test/ExtendedXmlSerializer.Tests.ReportedIssues/{Issue613Tests.cs => Issue614Tests.cs} (97%) diff --git a/test/ExtendedXmlSerializer.Tests.ReportedIssues/Issue613Tests.cs b/test/ExtendedXmlSerializer.Tests.ReportedIssues/Issue614Tests.cs similarity index 97% rename from test/ExtendedXmlSerializer.Tests.ReportedIssues/Issue613Tests.cs rename to test/ExtendedXmlSerializer.Tests.ReportedIssues/Issue614Tests.cs index 550563ba..a9d98f6d 100644 --- a/test/ExtendedXmlSerializer.Tests.ReportedIssues/Issue613Tests.cs +++ b/test/ExtendedXmlSerializer.Tests.ReportedIssues/Issue614Tests.cs @@ -5,7 +5,7 @@ namespace ExtendedXmlSerializer.Tests.ReportedIssues { - public sealed class Issue613Tests + public sealed class Issue614Tests { [Fact] public void Verify()