是否可以将XML反序列化为List <T>?给出以下XML:<?xml version="1.0"?><user_list>
<user>
<id>1</id>
<name>Joe</name>
</user>
<user>
<id>2</id>
<name>John</name>
</user></user_list>以下课程:public class User {
[XmlElement("id")]
public Int32 Id { get; set; }
[XmlElement("name")]
public String Name { get; set; }}是否可以使用XmlSerializer将xml反序列化为List<User>?如果是这样,我需要使用哪种类型的附加属性,或者我需要使用哪些其他参数来构造XmlSerializer实例?User[]如果有点不太可取的话,array()是可以接受的。
3 回答
守候你守候我
TA贡献1802条经验 获得超10个赞
您可以简单地封装列表:
using System;using System.Collections.Generic;using System.Xml.Serialization;[XmlRoot("user_list")]public class UserList{ public UserList() {Items = new List<User>();} [XmlElement("user")] public List<User> Items {get;set;}}public class User{ [XmlElement("id")] public Int32 Id { get; set; } [XmlElement("name")] public String Name { get; set; }}static class Program{ static void Main() { XmlSerializer ser= new XmlSerializer(typeof(UserList)); UserList list = new UserList(); list.Items.Add(new User { Id = 1, Name = "abc"}); list.Items.Add(new User { Id = 2, Name = "def"}); list.Items.Add(new User { Id = 3, Name = "ghi"}); ser.Serialize(Console.Out, list); }}
慕田峪4524236
TA贡献1875条经验 获得超5个赞
如果您User
使用XmlType
匹配所需大写的类来装饰类:
[XmlType("user")]public class User{ ...}
然后XmlRootAttribute
在XmlSerializer
ctor上可以提供所需的根并允许直接读入List <>:
// e.g. my test to create a file using (var writer = new FileStream("users.xml", FileMode.Create)) { XmlSerializer ser = new XmlSerializer(typeof(List<User>), new XmlRootAttribute("user_list")); List<User> list = new List<User>(); list.Add(new User { Id = 1, Name = "Joe" }); list.Add(new User { Id = 2, Name = "John" }); list.Add(new User { Id = 3, Name = "June" }); ser.Serialize(writer, list); }
...
// read file List<User> users; using (var reader = new StreamReader("users.xml")) { XmlSerializer deserializer = new XmlSerializer(typeof(List<User>), new XmlRootAttribute("user_list")); users = (List<User>)deserializer.Deserialize(reader); }
www说
TA贡献1775条经验 获得超8个赞
我想我找到了一个更好的方法。您不必将属性放入类中。我已经为序列化和反序列化制作了两种方法,它们将通用列表作为参数。
看一下(它对我有用):
private void SerializeParams<T>(XDocument doc, List<T> paramList) { System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(paramList.GetType()); System.Xml.XmlWriter writer = doc.CreateWriter(); serializer.Serialize(writer, paramList); writer.Close(); }private List<T> DeserializeParams<T>(XDocument doc) { System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(List<T>)); System.Xml.XmlReader reader = doc.CreateReader(); List<T> result = (List<T>)serializer.Deserialize(reader); reader.Close(); return result; }
所以你可以序列化你想要的任何列表!您不需要每次都指定列表类型。
List<AssemblyBO> list = new List<AssemblyBO>(); list.Add(new AssemblyBO()); list.Add(new AssemblyBO() { DisplayName = "Try", Identifier = "243242" }); XDocument doc = new XDocument(); SerializeParams<T>(doc, list); List<AssemblyBO> newList = DeserializeParams<AssemblyBO>(doc);
- 3 回答
- 0 关注
- 1105 浏览
添加回答
举报
0/150
提交
取消