序列化列表<;T>;包含列表<;T>;
本文关键字:gt lt 列表 包含 序列化 | 更新日期: 2023-09-27 17:58:45
我正在尝试序列化一个包含非系统类型的列表。
下面是我的序列化代码,它在顶级上运行良好。并返回一个有效的XmlDocument,但似乎在内部列表中不包含任何内容。
我看了看网,也看了看SO,但似乎什么都找不到!
非常感谢您的帮助。
代码:
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>
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>