A serialized <T> list containing a <T> list
I am trying to serialize a list that contains non-system types.
Below is my serialization code that works fine at the top level. and returns a valid XmlDocument, but does not seem to contain anything in the internal list.
I looked around the network - and around SO - but it seems I didn't find anything!
Any help is greatly appreciated.
the code:
public static XmlDocument SerializeToXML<T>(List<T> list, string rootElement) { XmlAttributeOverrides overrides = new XmlAttributeOverrides(); XmlAttributes attr = new XmlAttributes(); attr.XmlRoot = new XmlRootAttribute(rootElement); overrides.Add(typeof(List<T>), attr); XmlDocument xmlDoc = new XmlDocument(); XPathNavigator nav = xmlDoc.CreateNavigator(); using (XmlWriter writer = nav.AppendChild()) { XmlSerializer ser = new XmlSerializer(typeof(List<T>), overrides); ser.Serialize(writer, list); } return xmlDoc; } Code used for verification:
[TestFixture] public class BaseTesting { [Test] public void test() { List<ListTestClass> list = new List<ListTestClass>(); for (int i = 0; i < 20; i++) { list.Add(new ListTestClass() { intProp = 1, stringProp = "string1", dtProp = DateTime.Now }); } XmlDocument doc = Beyond.Base.Util.XMLUtils.SerializeToXML<ListTestClass>(list, "root"); } } public class ListTestClass { public int intProp { get; set; } public string stringProp { get; set; } public DateTime dtProp { get; set; } [XmlElement("Inner",typeof(InnerListTestClass))] public InnerListTestClass inner { get { return new InnerListTestClass() { intProp = 1, stringProp = "string1", dtProp = DateTime.Now }; } } } public class InnerListTestClass { public int intProp { get; set; } public string stringProp { get; set; } public DateTime dtProp { get; set; } } XML output:
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <ListTestClass> <intProp>1</intProp> <stringProp>string1</stringProp> <dtProp>2011-06-07T09:43:35.1017998+01:00</dtProp> </ListTestClass> <ListTestClass> <intProp>1</intProp> <stringProp>string1</stringProp> <dtProp>2011-06-07T09:43:35.1017998+01:00</dtProp> </ListTestClass> <ListTestClass> <intProp>1</intProp> <stringProp>string1</stringProp> <dtProp>2011-06-07T09:43:35.1017998+01:00</dtProp> </ListTestClass> <ListTestClass> <intProp>1</intProp> <stringProp>string1</stringProp> <dtProp>2011-06-07T09:43:35.1017998+01:00</dtProp> </ListTestClass> <ListTestClass> <intProp>1</intProp> <stringProp>string1</stringProp> <dtProp>2011-06-07T09:43:35.1017998+01:00</dtProp> </ListTestClass> <ListTestClass> <intProp>1</intProp> <stringProp>string1</stringProp> <dtProp>2011-06-07T09:43:35.1017998+01:00</dtProp> </ListTestClass> <ListTestClass> <intProp>1</intProp> <stringProp>string1</stringProp> <dtProp>2011-06-07T09:43:35.1017998+01:00</dtProp> </ListTestClass> <ListTestClass> <intProp>1</intProp> <stringProp>string1</stringProp> <dtProp>2011-06-07T09:43:35.1017998+01:00</dtProp> </ListTestClass> <ListTestClass> <intProp>1</intProp> <stringProp>string1</stringProp> <dtProp>2011-06-07T09:43:35.1017998+01:00</dtProp> </ListTestClass> <ListTestClass> <intProp>1</intProp> <stringProp>string1</stringProp> <dtProp>2011-06-07T09:43:35.1017998+01:00</dtProp> </ListTestClass> <ListTestClass> <intProp>1</intProp> <stringProp>string1</stringProp> <dtProp>2011-06-07T09:43:35.1017998+01:00</dtProp> </ListTestClass> <ListTestClass> <intProp>1</intProp> <stringProp>string1</stringProp> <dtProp>2011-06-07T09:43:35.1017998+01:00</dtProp> </ListTestClass> <ListTestClass> <intProp>1</intProp> <stringProp>string1</stringProp> <dtProp>2011-06-07T09:43:35.1017998+01:00</dtProp> </ListTestClass> <ListTestClass> <intProp>1</intProp> <stringProp>string1</stringProp> <dtProp>2011-06-07T09:43:35.1017998+01:00</dtProp> </ListTestClass> <ListTestClass> <intProp>1</intProp> <stringProp>string1</stringProp> <dtProp>2011-06-07T09:43:35.1017998+01:00</dtProp> </ListTestClass> <ListTestClass> <intProp>1</intProp> <stringProp>string1</stringProp> <dtProp>2011-06-07T09:43:35.1017998+01:00</dtProp> </ListTestClass> <ListTestClass> <intProp>1</intProp> <stringProp>string1</stringProp> <dtProp>2011-06-07T09:43:35.1017998+01:00</dtProp> </ListTestClass> <ListTestClass> <intProp>1</intProp> <stringProp>string1</stringProp> <dtProp>2011-06-07T09:43:35.1017998+01:00</dtProp> </ListTestClass> <ListTestClass> <intProp>1</intProp> <stringProp>string1</stringProp> <dtProp>2011-06-07T09:43:35.1017998+01:00</dtProp> </ListTestClass> <ListTestClass> <intProp>1</intProp> <stringProp>string1</stringProp> <dtProp>2011-06-07T09:43:35.1017998+01:00</dtProp> </ListTestClass> </root> +7
Stuart.Sklinar
source share1 answer
inner property must have a setter for serialization.
If you change it to
public InnerListTestClass inner { get; set; } It will be serialized as you expect.
<ListTestClass> <intProp>1</intProp> <stringProp>string1</stringProp> <dtProp>2011-06-07T01:57:07.1200742-07:00</dtProp> <Inner> <intProp>1</intProp> <stringProp>string1</stringProp> <dtProp>2011-06-07T01:57:07.1210743-07:00</dtProp> </Inner> </ListTestClass> +4
Alex aza
source share