为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
jeck猫 2019-07-26 15:55:55
是否可以将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);
    }}


查看完整回答
反对 回复 2019-07-26
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

如果您User使用XmlType匹配所需大写的类来装饰类:

[XmlType("user")]public class User{
   ...}

然后XmlRootAttributeXmlSerializerctor上可以提供所需的根并允许直接读入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);
    }

信用:基于答案来自YK1


查看完整回答
反对 回复 2019-07-26
?
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);


查看完整回答
反对 回复 2019-07-26
  • 3 回答
  • 0 关注
  • 1105 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信