1

I'm attempting to serialize a class to XML, but I have some strict requirements on the output (because I want Rails' ActiveResource to consume it). One of those requirements is specifically for arrays. Here's two examples:

class Person { public string FirstName { get; set; } }

List<Person> people = new List<Person>();
people.Add( new Person {...} );
people.Add( new Person {...} );

If I serialize the people list, I need this output:

<People type="array">
  <Person>
    <FirstName>blah</FirstName>
  </Person>
  <Person>...</Person>
</People>

Another example is like this:

class Person
{
  public string FirstName { get; set; }
  public List<Address> Addresses { get; set; }
}

class Address
{
  public string Line1 { get; set; }
}

If a serialize a person, I need this output:

<Person>
  <FirstName>blah</FirstName>
  <Addresses type="array">
    <Address>...</Address>
  </Addresses>
</Person>

Is there anyway to trick the XmlSerializer into producing this output?

1 Answer 1

0

You can also take a look at Controlling XML Serialization Using Attributes.

Something like this may work for you

[XmlRoot(ElementName="People")]
public class PeopleType
{
    [XmlElement(ElementName="Person")]
    public List<Person> people  = new List<Person>()
    {
        new Person { FirstName = "Bob" },
        new Person { FirstName = "Sally" }
    };

    [XmlAttribute]
    public string type = "array";
}

PeopleType p = new PeopleType();
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
XmlSerializer xs = new XmlSerializer(typeof(PeopleType));
using (StreamWriter sw = new StreamWriter("out.xml", false))
    xs.Serialize(sw, p, ns);
Sign up to request clarification or add additional context in comments.

1 Comment

This works great. I just want to point out that it does NOT work with JSON serialization however. You'll get {"people":[...]} when what you want is just [...]. That it said, it solves the xml issue perfectly.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.