Список сериализации <T>, содержащий список <T> - PullRequest
7 голосов
/ 07 июня 2011

Я пытаюсь сериализовать список, содержащий несистемные типы.

Ниже приведен мой код сериализации, который отлично работает на верхнем уровне. и возвращает действительный XmlDocument, но, похоже, ничего не содержит во внутреннем списке.

Я огляделся вокруг - и вокруг, - но не могу найти ничего!

Любая помощь высоко ценится.

Код:

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;
}

Код, используемый для проверки:

[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:

<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>

1 Ответ

4 голосов
/ 07 июня 2011

inner свойство должно иметь setter, чтобы быть сериализуемым.

Если вы измените его на

public InnerListTestClass inner { get; set; }

Он будет сериализован, как вы ожидаете.

<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>
...