如何将 xml 对象反序列化回类列表

Posted

技术标签:

【中文标题】如何将 xml 对象反序列化回类列表【英文标题】:How to deserialize xml objects back to a class list 【发布时间】:2021-05-28 00:28:53 【问题描述】:

我正在尝试创建一个 Windows 窗体应用程序,在该应用程序中,我在业务类列表中创建了一个车辆类对象列表。当一个新项目被添加到列表中时,该文件被序列化。我创建了一个名为 Vehicle 的类,其中包含 xml 属性、添加车辆类新实例的方法以及将数据序列化到 xml 文件的方法。我想关闭应用程序并重新打开它以在数据网格视图等视图中显示这些数据。我目前遇到的问题是我不确定如何将数据反序列化回类列表并显示它。当我退出应用程序并再次打开它然后尝试添加新车辆时,它会覆盖 xml 文件中的当前数据。

这是我的商务类和我的序列化方法:

using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;

namespace VehicleSystem

    public class Business
    
        private static List<Vehicle> _vehicleList = new List<Vehicle>();

        public static List<Vehicle> VehicleList
        
            get => _vehicleList;
        

      
        public static void Save()
        
            XmlSerializer serial = new XmlSerializer(typeof(List<Vehicle>));
            using (FileStream file = new FileStream("C:\\temp\\data.xml", FileMode.Create))
            
                serial.Serialize(file, VehicleList);
                file.Close();
            
        
    

这是车辆类别:

using System;
using System.Collections.Generic;
using System.IO;
using System.Windows.Forms;
using System.Xml.Serialization;

namespace VehicleSystem

    [XmlType("vehicle")]
    [Serializable]
    public class Vehicle
    
        private int _cost;
        private int _year;
        private string _make;
        private string _model;
        private string _registration;

        [XmlElement("Registration")]
        public string Registration  get => _registration; set => _registration = value; 
        [XmlElement("Model")]
        public string Model  get => _model; set => _model = value; 
        [XmlElement("Make")]
        public string Make  get => _make; set => _make = value; 
        [XmlElement("Year")]
        public int Year  get => _year; set => _year = value; 
        [XmlElement("Cost")]
        public int Cost  get => _cost; set => _cost = value; 

        public Vehicle(string registration, string model, string make, int year, int cost)
        
            Registration = registration;
            Model = model;
            Make = make;
            Year = year;
            Cost = cost;
        
    

这是车辆的创建:

Business.VehicleList.Add(new Vehicle("ABC123","Hilux","Toyota", 1992, 123));
Business.Save();

这就是xml数据的样子

        <?xml version="1.0"?>
    
-<ArrayOfVehicle xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    -<vehicle>
        <Registration>ABC123</Registration>
        <Model>Hilux</Model>
        <Make>Toyota</Make>
        <Year>1992</Year>
        <Cost>123</Cost>
    </vehicle>
</ArrayOfVehicle>

如何将这些数据反序列化回我的 VehicleList 并将其显示到 datagridview 中?

【问题讨论】:

【参考方案1】:

您只需要放入一个数据集,然后将零表作为 DGV 的数据源。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;


namespace ConsoleApplication189
   
    class Program
    
        const string FILENAME = @"C:\temp\test.xml";
        static void Main(string[] args)
        
            DataSet ds = new DataSet();
            ds.ReadXml(FILENAME);
 
        
 
    

【讨论】:

以上是关于如何将 xml 对象反序列化回类列表的主要内容,如果未能解决你的问题,请参考以下文章

如何将 XML 反序列化为 C# 中的对象? [复制]

XML 反序列化带回空列表

C# Xmlserializer 将列表反序列化为 0 而不是 null

如何从 nusoap 服务返回的 XML 反序列化对象?

如何将xml反序列化为对象[重复]

反序列化后无法获取从xml文件返回的项目列表