Skip to content

Commit 77b3379

Browse files
Merge pull request #1411 from partyz0ne/master
Add ability to serialize list of items with type of interface.
2 parents 9d98e56 + 94b5dc2 commit 77b3379

File tree

4 files changed

+74
-47
lines changed

4 files changed

+74
-47
lines changed

.github/workflows/build-master.yml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,3 @@ jobs:
5252

5353
- name: Create NuGet package
5454
run: dotnet pack -c Release -o nuget -p:IncludeSymbols=true -p:SymbolPackageFormat=snupkg
55-
56-
- name: Push NuGet package
57-
run: dotnet nuget push **/*.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate
58-
59-

.github/workflows/publish-docs.yml

Lines changed: 0 additions & 30 deletions
This file was deleted.

src/RestSharp/Serializers/Xml/XmlSerializer.cs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -193,19 +193,14 @@ void Map(XContainer root, object obj)
193193
}
194194
else if (rawValue is IList items)
195195
{
196-
var itemTypeName = "";
197-
198196
foreach (var item in items)
199197
{
200-
if (itemTypeName == "")
201-
{
202-
var type = item.GetType();
203-
var setting = type.GetAttribute<SerializeAsAttribute>();
198+
var type = item.GetType();
199+
var setting = type.GetAttribute<SerializeAsAttribute>();
204200

205-
itemTypeName = setting != null && setting.Name.HasValue()
206-
? setting.Name
207-
: type.Name;
208-
}
201+
var itemTypeName = setting != null && setting.Name.HasValue()
202+
? setting.Name
203+
: type.Name;
209204

210205
var instance = new XElement(itemTypeName.AsNamespaced(Namespace));
211206

test/RestSharp.Tests/XmlSerializerTests.cs

Lines changed: 69 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,36 @@ public XmlSerializerTests()
1818
Thread.CurrentThread.CurrentUICulture = CultureInfo.InstalledUICulture;
1919
}
2020

21+
[Test]
22+
public void Can_serialize_a_list_of_items_with_interface_type()
23+
{
24+
var items = new NamedItems
25+
{
26+
Items = new List<INamed>
27+
{
28+
new Person
29+
{
30+
Name = "Foo",
31+
Age = 50,
32+
Price = 19.95m,
33+
StartDate = new DateTime(2009, 12, 18, 10, 2, 23),
34+
Items = new List<Item>
35+
{
36+
new Item {Name = "One", Value = 1},
37+
}
38+
},
39+
new Item {Name = "Two", Value = 2},
40+
new Item {Name = "Three", Value = 3}
41+
}
42+
};
43+
44+
var xml = new XmlSerializer();
45+
var doc = xml.Serialize(items);
46+
var expected = GetNamedItemsXDoc(CultureInfo.InvariantCulture);
47+
48+
Assert.AreEqual(expected.ToString(), doc);
49+
}
50+
2151
[Test]
2252
public void Can_serialize_a_list_which_is_the_content_of_root_element()
2353
{
@@ -289,7 +319,12 @@ public void Serializes_Properties_In_Specified_Order()
289319
Assert.AreEqual(expected.ToString(), doc);
290320
}
291321

292-
class Person
322+
interface INamed
323+
{
324+
string Name { get; set; }
325+
}
326+
327+
class Person : INamed
293328
{
294329
public string Name { get; set; }
295330

@@ -304,7 +339,7 @@ class Person
304339
public bool? IsCool { get; set; }
305340
}
306341

307-
class Item
342+
class Item : INamed
308343
{
309344
public string Name { get; set; }
310345

@@ -336,6 +371,12 @@ class WackyPerson
336371
public ContactData ContactData { get; set; }
337372
}
338373

374+
class NamedItems
375+
{
376+
[SerializeAs(Content = true)]
377+
public List<INamed> Items { get; set; }
378+
}
379+
339380
[SerializeAs(Name = "People")]
340381
class Contacts
341382
{
@@ -527,6 +568,32 @@ static XDocument GetSortedPropsXDoc()
527568
return doc;
528569
}
529570

571+
static XDocument GetNamedItemsXDoc(IFormatProvider culture)
572+
{
573+
var doc = new XDocument();
574+
var root = new XElement("NamedItems");
575+
var element = new XElement("Person");
576+
var items = new XElement("Items");
577+
578+
items.Add(new XElement("Item", new XElement("Name", "One"), new XElement("Value", 1)));
579+
580+
element.Add(
581+
new XElement("Name", "Foo"),
582+
new XElement("Age", 50),
583+
new XElement("Price", 19.95m.ToString(culture)),
584+
new XElement("StartDate", new DateTime(2009, 12, 18, 10, 2, 23).ToString(culture))
585+
);
586+
587+
element.Add(items);
588+
root.Add(element);
589+
root.Add(new XElement("Item", new XElement("Name", "Two"), new XElement("Value", 2)));
590+
root.Add(new XElement("Item", new XElement("Name", "Three"), new XElement("Value", 3)));
591+
592+
doc.Add(root);
593+
594+
return doc;
595+
}
596+
530597
static XDocument GetPeopleXDoc(IFormatProvider culture)
531598
{
532599
var doc = new XDocument();

0 commit comments

Comments
 (0)