猿问

是否可以将XML反序列化为List <T>?

是否可以将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()是可以接受的。


jeck猫
浏览 1106回答 3
3回答

守候你守候我

您可以简单地封装列表:using&nbsp;System;using&nbsp;System.Collections.Generic;using&nbsp;System.Xml.Serialization;[XmlRoot("user_list")]public&nbsp;class&nbsp;UserList{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;UserList()&nbsp;{Items&nbsp;=&nbsp;new&nbsp;List<User>();} &nbsp;&nbsp;&nbsp;&nbsp;[XmlElement("user")] &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;List<User>&nbsp;Items&nbsp;{get;set;}}public&nbsp;class&nbsp;User{ &nbsp;&nbsp;&nbsp;&nbsp;[XmlElement("id")] &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Int32&nbsp;Id&nbsp;{&nbsp;get;&nbsp;set;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;[XmlElement("name")] &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;Name&nbsp;{&nbsp;get;&nbsp;set;&nbsp;}}static&nbsp;class&nbsp;Program{ &nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;void&nbsp;Main() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XmlSerializer&nbsp;ser=&nbsp;new&nbsp;XmlSerializer(typeof(UserList)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserList&nbsp;list&nbsp;=&nbsp;new&nbsp;UserList(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.Items.Add(new&nbsp;User&nbsp;{&nbsp;Id&nbsp;=&nbsp;1,&nbsp;Name&nbsp;=&nbsp;"abc"}); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.Items.Add(new&nbsp;User&nbsp;{&nbsp;Id&nbsp;=&nbsp;2,&nbsp;Name&nbsp;=&nbsp;"def"}); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.Items.Add(new&nbsp;User&nbsp;{&nbsp;Id&nbsp;=&nbsp;3,&nbsp;Name&nbsp;=&nbsp;"ghi"}); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ser.Serialize(Console.Out,&nbsp;list); &nbsp;&nbsp;&nbsp;&nbsp;}}

慕田峪4524236

如果您User使用XmlType匹配所需大写的类来装饰类:[XmlType("user")]public&nbsp;class&nbsp;User{ &nbsp;&nbsp;&nbsp;...}然后XmlRootAttribute在XmlSerializerctor上可以提供所需的根并允许直接读入List <>:&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;e.g.&nbsp;my&nbsp;test&nbsp;to&nbsp;create&nbsp;a&nbsp;file &nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;(var&nbsp;writer&nbsp;=&nbsp;new&nbsp;FileStream("users.xml",&nbsp;FileMode.Create)) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XmlSerializer&nbsp;ser&nbsp;=&nbsp;new&nbsp;XmlSerializer(typeof(List<User>),&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;XmlRootAttribute("user_list")); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List<User>&nbsp;list&nbsp;=&nbsp;new&nbsp;List<User>(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.Add(new&nbsp;User&nbsp;{&nbsp;Id&nbsp;=&nbsp;1,&nbsp;Name&nbsp;=&nbsp;"Joe"&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.Add(new&nbsp;User&nbsp;{&nbsp;Id&nbsp;=&nbsp;2,&nbsp;Name&nbsp;=&nbsp;"John"&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.Add(new&nbsp;User&nbsp;{&nbsp;Id&nbsp;=&nbsp;3,&nbsp;Name&nbsp;=&nbsp;"June"&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ser.Serialize(writer,&nbsp;list); &nbsp;&nbsp;&nbsp;&nbsp;}...&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;read&nbsp;file &nbsp;&nbsp;&nbsp;&nbsp;List<User>&nbsp;users; &nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;(var&nbsp;reader&nbsp;=&nbsp;new&nbsp;StreamReader("users.xml")) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XmlSerializer&nbsp;deserializer&nbsp;=&nbsp;new&nbsp;XmlSerializer(typeof(List<User>),&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;XmlRootAttribute("user_list")); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;users&nbsp;=&nbsp;(List<User>)deserializer.Deserialize(reader); &nbsp;&nbsp;&nbsp;&nbsp;}信用:基于答案来自YK1。

www说

我想我找到了一个更好的方法。您不必将属性放入类中。我已经为序列化和反序列化制作了两种方法,它们将通用列表作为参数。看一下(它对我有用):private&nbsp;void&nbsp;SerializeParams<T>(XDocument&nbsp;doc,&nbsp;List<T>&nbsp;paramList) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Xml.Serialization.XmlSerializer&nbsp;serializer&nbsp;=&nbsp;new&nbsp;System.Xml.Serialization.XmlSerializer(paramList.GetType()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Xml.XmlWriter&nbsp;writer&nbsp;=&nbsp;doc.CreateWriter(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;serializer.Serialize(writer,&nbsp;paramList); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.Close();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}private&nbsp;List<T>&nbsp;DeserializeParams<T>(XDocument&nbsp;doc) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Xml.Serialization.XmlSerializer&nbsp;serializer&nbsp;=&nbsp;new&nbsp;System.Xml.Serialization.XmlSerializer(typeof(List<T>)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Xml.XmlReader&nbsp;reader&nbsp;=&nbsp;doc.CreateReader(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List<T>&nbsp;result&nbsp;=&nbsp;(List<T>)serializer.Deserialize(reader); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader.Close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;result; &nbsp;&nbsp;&nbsp;&nbsp;}所以你可以序列化你想要的任何列表!您不需要每次都指定列表类型。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List<AssemblyBO>&nbsp;list&nbsp;=&nbsp;new&nbsp;List<AssemblyBO>(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.Add(new&nbsp;AssemblyBO()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.Add(new&nbsp;AssemblyBO()&nbsp;{&nbsp;DisplayName&nbsp;=&nbsp;"Try",&nbsp;Identifier&nbsp;=&nbsp;"243242"&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XDocument&nbsp;doc&nbsp;=&nbsp;new&nbsp;XDocument(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SerializeParams<T>(doc,&nbsp;list); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List<AssemblyBO>&nbsp;newList&nbsp;=&nbsp;DeserializeParams<AssemblyBO>(doc);
随时随地看视频慕课网APP
我要回答