From 3c185e21c2e01bfcb31682dbf6bd7e90529eb413 Mon Sep 17 00:00:00 2001 From: Tom Gallard Date: Wed, 15 Oct 2014 15:51:32 +0100 Subject: [PATCH] Fixed bug where XmlDeserializer would not deserialize public nested types The RestSharp XmlDeserializer only tries to deserialize types where Type.IsPublic is true. For nested public classes, Type.IsPublic is false, but Type.IsNestedPublic is true . Updated deserializer to check for this condition --- RestSharp.Tests/NamespacedXmlTests.cs | 6 +++++- RestSharp.Tests/SampleClasses/misc.cs | 5 +++++ RestSharp.Tests/XmlAttributeDeserializerTests.cs | 15 +++++++++++++++ RestSharp/Deserializers/XmlDeserializer.cs | 4 ++-- 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/RestSharp.Tests/NamespacedXmlTests.cs b/RestSharp.Tests/NamespacedXmlTests.cs index cd08ea8e6..83d4ac74e 100644 --- a/RestSharp.Tests/NamespacedXmlTests.cs +++ b/RestSharp.Tests/NamespacedXmlTests.cs @@ -253,7 +253,11 @@ private static string CreateElementsXml() { new XElement(ns + "Since", DateTime.Now.Year - i) )); } - root.Add(friends); + root.Add(friends); + + root.Add(new XElement(ns + "FavoriteBand", + new XElement(ns + "Name", "Goldfinger") + )); doc.Add(root); return doc.ToString(); diff --git a/RestSharp.Tests/SampleClasses/misc.cs b/RestSharp.Tests/SampleClasses/misc.cs index ed5d029e6..0831a8b32 100644 --- a/RestSharp.Tests/SampleClasses/misc.cs +++ b/RestSharp.Tests/SampleClasses/misc.cs @@ -48,6 +48,11 @@ public class PersonForXml public Order Order { get; set; } public Disposition Disposition { get; set; } + public Band FavoriteBand { get; set; } + public class Band + { + public string Name { get; set; } + } } diff --git a/RestSharp.Tests/XmlAttributeDeserializerTests.cs b/RestSharp.Tests/XmlAttributeDeserializerTests.cs index 0cfc0e26b..4dc8e4f0d 100644 --- a/RestSharp.Tests/XmlAttributeDeserializerTests.cs +++ b/RestSharp.Tests/XmlAttributeDeserializerTests.cs @@ -290,7 +290,18 @@ public void Can_Deserialize_Custom_Formatted_Date() Assert.Equal(date, output.StartDate); } + [Fact] + public void Can_Deserialize_Nested_Class() + { + var doc = CreateElementsXml(); + var response = new RestResponse { Content = doc }; + + var d = new XmlAttributeDeserializer(); + var p = d.Deserialize(response); + Assert.NotNull(p.FavoriteBand); + Assert.Equal("Goldfinger",p.FavoriteBand.Name); + } [Fact] public void Can_Deserialize_Elements_On_Default_Root() { @@ -839,6 +850,10 @@ private static string CreateElementsXml() } root.Add(friends); + root.Add(new XElement("FavoriteBand", + new XElement("Name", "Goldfinger") + )); + doc.Add(root); return doc.ToString(); } diff --git a/RestSharp/Deserializers/XmlDeserializer.cs b/RestSharp/Deserializers/XmlDeserializer.cs index 277b4fee6..37196830e 100644 --- a/RestSharp/Deserializers/XmlDeserializer.cs +++ b/RestSharp/Deserializers/XmlDeserializer.cs @@ -96,8 +96,8 @@ protected virtual void Map(object x, XElement root) foreach (var prop in props) { var type = prop.PropertyType; - - if (!type.IsPublic || !prop.CanWrite) + var typeIsPublic = type.IsPublic || type.IsNestedPublic; + if (!typeIsPublic || !prop.CanWrite) continue; var name = prop.Name.AsNamespaced(Namespace);