0

I'm using DataContractSerializer to serialize an object that has a property of type List and I want to control how the strings are emitted.

[DataContract(Name = "ReportData", Namespace = "")]
public class Foo
{
    [DataMember]
    public List<string> TrackingNumbers { get; set; }
}

When I serialize this object I get this XML:

<ReportData xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <TrackingNumbers xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    <a:string>14735ec8-81c4-44e4-9bbe-6c661eb74e54</a:string>
  </TrackingNumbers>
</ReportData>

What I would like is:

<ReportData xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <TrackingNumbers xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    <TrackingNumber>14735ec8-81c4-44e4-9bbe-6c661eb74e54</TrackingNumber>
  </TrackingNumbers>
</ReportData>

Is this possible with DataContractSerializer? It was trivial with XmlSerializer and XmlArrayItem but I cannot figure it out.

Also, is it possible to generate XML that does not contain any namespace declarations?

Thanks very much.

dbc
  • 104,963
  • 20
  • 228
  • 340
dlarkin77
  • 867
  • 1
  • 11
  • 27
  • 1
    You can subclass `List` and apply `[CollectionDataContract(ItemName="TrackingNumber", Namespace = "")]`. See: [Custom Element Names using the DataContractSerializer on a List of primitives](https://stackoverflow.com/q/5516907/3744182) and [How to Deserialize XML using DataContractSerializer](https://stackoverflow.com/q/16943176/3744182). – dbc Nov 27 '20 at 23:02
  • 1
    Thanks very much @dbc, that did the trick – dlarkin77 Nov 28 '20 at 11:44

1 Answers1

0

This works for me. It's more or less exactly what @dbc suggested :)

[CollectionDataContract(Namespace = "", ItemName = "TrackingNumber")]
internal class TrackingNumbersList : List<string>
{ }
    
[DataContract(Name = "ReportData", Namespace = "")]
public class Foo
{
    [DataMember]
    public TrackingNumbersList  TrackingNumbers { get; set; }
}
dlarkin77
  • 867
  • 1
  • 11
  • 27