Skip to content

Commit 3c185e2

Browse files
committed
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
1 parent 2d9c57e commit 3c185e2

File tree

4 files changed

+27
-3
lines changed

4 files changed

+27
-3
lines changed

RestSharp.Tests/NamespacedXmlTests.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,11 @@ private static string CreateElementsXml() {
253253
new XElement(ns + "Since", DateTime.Now.Year - i)
254254
));
255255
}
256-
root.Add(friends);
256+
root.Add(friends);
257+
258+
root.Add(new XElement(ns + "FavoriteBand",
259+
new XElement(ns + "Name", "Goldfinger")
260+
));
257261

258262
doc.Add(root);
259263
return doc.ToString();

RestSharp.Tests/SampleClasses/misc.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ public class PersonForXml
4848
public Order Order { get; set; }
4949

5050
public Disposition Disposition { get; set; }
51+
public Band FavoriteBand { get; set; }
52+
public class Band
53+
{
54+
public string Name { get; set; }
55+
}
5156

5257
}
5358

RestSharp.Tests/XmlAttributeDeserializerTests.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,18 @@ public void Can_Deserialize_Custom_Formatted_Date()
290290

291291
Assert.Equal(date, output.StartDate);
292292
}
293+
[Fact]
294+
public void Can_Deserialize_Nested_Class()
295+
{
296+
var doc = CreateElementsXml();
297+
var response = new RestResponse { Content = doc };
298+
299+
var d = new XmlAttributeDeserializer();
300+
var p = d.Deserialize<PersonForXml>(response);
293301

302+
Assert.NotNull(p.FavoriteBand);
303+
Assert.Equal("Goldfinger",p.FavoriteBand.Name);
304+
}
294305
[Fact]
295306
public void Can_Deserialize_Elements_On_Default_Root()
296307
{
@@ -839,6 +850,10 @@ private static string CreateElementsXml()
839850
}
840851
root.Add(friends);
841852

853+
root.Add(new XElement("FavoriteBand",
854+
new XElement("Name", "Goldfinger")
855+
));
856+
842857
doc.Add(root);
843858
return doc.ToString();
844859
}

RestSharp/Deserializers/XmlDeserializer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,8 @@ protected virtual void Map(object x, XElement root)
9696
foreach (var prop in props)
9797
{
9898
var type = prop.PropertyType;
99-
100-
if (!type.IsPublic || !prop.CanWrite)
99+
var typeIsPublic = type.IsPublic || type.IsNestedPublic;
100+
if (!typeIsPublic || !prop.CanWrite)
101101
continue;
102102

103103
var name = prop.Name.AsNamespaced(Namespace);

0 commit comments

Comments
 (0)