ZeroBased_IX
ZeroBased_IX

Reputation: 2727

XMLSerialization Nesting

I'm doing some XML Serialization and trying to get the output like so:

<Claim>
   <Source>...</Source>
   <Vehicle>...</Vehicle>
   <ThirdParty>...</ThirdParty>
   <ThirdParty>...</ThirdParty>
   <ThirdParty>...</ThirdParty>
</Claim>

However my output is:

  <Claim>
       <Source>...</Source>
       <Vehicle>...</Vehicle>
       <ThirdParty>
          <ThirdParty>...</ThirdParty>
          <ThirdParty>...</ThirdParty>
          <ThirdParty>...</ThirdParty>
       </ThirdParty>
    </Claim>

The Third Parties are nested inside the List instead of Claim, how can I get the Thirdparties at the base of the XML instead of inside another ThirdParty Node. I hope this makes sense.

My Objects that I'm trying to serialize:

    public class ThirdParty
    {
        public ThirdPartyDetails Details { get; set; }
        public ThirdPartyVehicle Vehicle { get; set; }
        public ThirdPartyPolicy Policy { get; set; }
        public ThirdPartyPrincipleCompany PrincipleCompany { get; set; } 
    }


public class Claim
{
     public List<ThirdParty> ThirdParty { get; set; }
}

Intialization

ThirdParty ThirdParty1 = new ThirdParty{ Details = ThirdPartyDetails, Policy=ThirdPartyPolicy, PrincipleCompany=ThirdPartyPrinciple, Vehicle=ThirdPartyVehicle};

ThirdParty ThirdParty2 = new ThirdParty{ Details = ThirdPartyDetails, Policy=ThirdPartyPolicy, PrincipleCompany=ThirdPartyPrinciple, Vehicle=ThirdPartyVehicle};

List<ThirdParty> LP = new List<ThirdParty>();

LP.Add(ThirdParty1);
LP.Add(ThirdParty2);


Claim Claim = new Claim { ThirdParty = LP };

Serialization

  var subReq = Claim;
            using (StringWriter sww = new Utf8StringWriter())
            {
                XmlWriterSettings xmlWriterSettings = new XmlWriterSettings
                {
                    Indent = true,
                    OmitXmlDeclaration = false,
                    Encoding = Encoding.Unicode
                };

                using (XmlWriter writer = XmlWriter.Create(sww, xmlWriterSettings))
                {
                    xsSubmit.Serialize(writer, subReq);
                    var xml = sww.ToString();
                    PrintOutput(xml);

                    Console.WriteLine(xml);
                }
            }

Edit: In response to Peter:

Okay, now I'm having a problem with the output, I'm not using it correctly I think. So because I'm inheriting the properties of List I can then use the Add method of List: claim.Add(ThirdParty1); claim.Add(ThirdParty2); Now my output is ... ... It's completely Ignored Source and Vehicle. Any ideas?

Upvotes: 1

Views: 77

Answers (1)

Peter Wone
Peter Wone

Reputation: 18765

You have declared that Claim has a collection of ThirdParty but you want it serialised as though Claim is a collection of ThirdParty.

To obtain a scenario in which Claim is a collection of ThirdParty, derive Claim from List<ThirdParty> and add the required properties and methods.

This sample assumes you have another class Vehicle.

public class Claim : List<ThirdParty> {
  public string Source { get; set; }
  public Vehicle Vehicle { get; set; }
}

Claim is a list of ThirdParty but has other properties and potentially additional methods also.

However

That won't work. If you do that it stops serialising all the other properties, all you get is children of the collection.

So stick with composition, but mark it up with the [XmlElement] attribute, like this:

public class Claim 
{
  public Source Source { get; set; }
  public Driver Driver { get; set; }
  public Owner Owner { get; set; }
  public Vehicle Vehicle { get; set; }
  public Accident Accident { get; set; }
  public Policy Policy { get; set; }
  public Insurer Insurer { get; set; }
  public Solicitor Solicitor { get; set; }
  [XmlElement]
  public List<ThirdParty> ThirdParty { get; set; } 
}

Upvotes: 3

Related Questions