【问题标题】:C# deserialize xml file to form List<T>C# 反序列化 xml 文件以形成 List<T>
【发布时间】:2010-11-29 00:58:33
【问题描述】:

我有以下课程,我正在尝试对 XML 文件进行序列化和反序列化:

public class cUrlData
{
    public string ProgramName {get;set;}
    public string ExeName { get; set; }
    public string Category { get; set; }
    public string URL { get; set; }

    public cUrlData()
    {
    }

    public void Add(string ProgramName, string ExeName, string Category, string ProgramURL)
    {
        this.ProgramName = ProgramName;
        this.ExeName = ExeName;
        this.URL = ProgramURL;
        this.Category = Category;
    }

}

我一直在使用以下代码进行测试:

public List<cUrlData> SoftwareData = new List<cUrlData>();
cUrlData urlData;
cXml xml;

public frmUpdater()
{
    InitializeComponent();

    xml = new cXml("data.xml", ref SoftwareData);
    xml.Load();  // NOT WORKING - SO I GENERATE MY OWN DATA BELOW

    // Set up some test data to work with
    urlData = new cUrlData();
    urlData.Add("Program1",
                            "Program1.exe",
                            "myDownloads",
                            "http://www.source.com/program1.exe");

    SoftwareData.Add(urlData);

    urlData = new cUrlData();
    urlData.Add("Program2",
                            "Program2.exe",
                            "myDownloads",
                            "http://www.source.com/program2.exe");

    SoftwareData.Add(urlData);

    urlData = new cUrlData();
    urlData.Add("Program3",
                            "Program3.exe",
                            "myDownloads",
                            "http://www.source.com/program3.exe");
    SoftwareData.Add(urlData);

}

我遇到的问题是找到一种可靠的方法将列表与 XML 文件相互转换。我目前遍历类列表并逐个节点手动创建 xml 文件,并在将其从 xml 文件读取到类时执行相同操作,但这很容易出错。我已尝试获取以下代码来读取文件,但无济于事,我将不胜感激,因为我确信这是一个编码问题!

public void Load() {
    XmlSerializer serializer = new XmlSerializer(typeof(List<cUrlData>));

    using (XmlReader reader = XmlReader.Create("data.xml"))
    {
        cUrlData myXmlClass = (cUrlData)serializer.Deserialize(reader);
    }
}

加载后,我想尝试让它写回 xml 文件。同样,与上面的代码类似。

谢谢

【问题讨论】:

  • 您使用的是 XmlSerializer 但没有使用任何 XML 属性,但话说回来,它们可能不再需要了,我忘记了他们是否像使用 JSON 序列化一样将其从框架中取出...... .

标签: c# .net xml xml-serialization


【解决方案1】:

这里应该是让您开始保存和加载的通用解决方案

private void SaveData(List<cUrlData> SoftwareData)
{
    try
    {
        using (TextWriter reader = new StreamWriter("data.xml"))
        {
            (new XmlSerializer(typeof(List<cUrlData>))).Serialize(reader, SoftwareData);
        }
    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message);
    }
}
private List<cUrlData> LoadData()
{
    List<cUrlData> mysXmlClass = null;

    try
    {
        using (TextReader reader = new StreamReader("data.xml"))
        {
            object myXmlClass = (object)(new XmlSerializer(typeof(List<cUrlData>))).Deserialize(reader);
            mysXmlClass = (List<cUrlData>)myXmlClass;
        }
    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message);
    }

    return mysXmlClass;
}

确实需要调整一下。我使用熟悉的 TextReaders 和 StreamReaders。

【讨论】:

    【解决方案2】:

    MrNYE 的想法是正确的。这是我们使用编码选项进行序列化和反序列化的完整类。

    享受吧!

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Xml.Serialization;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.IO;
    using System.Xml;
    
    namespace xml.serialization
    {
    /// <summary>
    /// Class to serialize generic objects.
    /// </summary>
    public static class ObjectSerializer
    {
        /// <summary>
        /// Decode from xml string with default UTF8 encoding
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="xml"></param>
        /// <returns></returns>
        public static T FromString<T>(string xml)
        {
            Encoding e = Encoding.UTF8;
            return FromString<T>(xml, e);
        }
    
        /// <summary>
        /// Decode from xml string with UTF16 unicode
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="xml"></param>
        /// <returns></returns>
        public static T FromStringUTF16<T>(string xml)
        {
            Encoding e = Encoding.Unicode;
            return FromString<T>(xml, e);
        }
    
        /// <summary>
        /// Decode from xml string with privided encoding type
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="xml"></param>
        /// <param name="e"></param>
        /// <returns></returns>
        public static T FromString<T>(string xml, Encoding e)
        {
            Object ret = null;
            XmlSerializer s = new XmlSerializer(typeof(T));
    
            using (MemoryStream stream = new MemoryStream(e.GetBytes(xml)))
            {
                XmlTextWriter xtWriter = new XmlTextWriter(stream, e);
                ret = s.Deserialize(stream);
                //xtWriter.Close();
            }
    
            return (T)ret;
        }
    
        /// <summary>
        /// Serialize to xml with default UTF8 encoding
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static string ToString<T>(T obj)
        {
            Encoding e = Encoding.UTF8;
            return ToString(obj, e);
        }
    
        /// <summary>
        /// Serialize to xml with UTF16 encoding
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static string ToStringUTF16<T>(T obj)
        {
            Encoding e = Encoding.Unicode;
            return ToString(obj, e);
        }
    
    
        /// <summary>
        /// Serialize to xml with specified encoding
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="obj"></param>
        /// <param name="e"></param>
        /// <returns></returns>
        public static string ToString<T>(T obj, Encoding e)
        {
            string ret = String.Empty;
            XmlSerializer s = new XmlSerializer(typeof(T));
    
            using (MemoryStream stream = new MemoryStream())
            {
                XmlTextWriter xtWriter = new XmlTextWriter(stream, e);
                s.Serialize(xtWriter, obj);
                xtWriter.Close();
                ret = e.GetString(stream.ToArray());
            }
    
            return ret;
        }
    
    
        /// <summary>
        /// Serialize to xml to to a file with default UTF8 encoding
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="obj"></param>
        /// <param name="filePath"></param>
        public static void ToXmlFile<T>(T obj, string filePath)
        {
            Encoding e = Encoding.UTF8;
            ToXmlFile<T>(obj, filePath, e);
        }
    
        /// <summary>
        /// Serialize to xml to to a file with specific encoding
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="obj"></param>
        /// <param name="filePath"></param>
        /// <param name="e"></param>
        public static void ToXmlFile<T>(T obj, string filePath, Encoding e)
        {
            XmlSerializer s = new XmlSerializer(typeof(T));
    
            using (TextWriter w = new StreamWriter(filePath, false, e))
            {
                s.Serialize(w, obj);
                w.Flush();
                w.Close();
            }
        }
    
        /// <summary>
        /// Deserialize from a file of xml useing default UTF8 encoding
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="filePath"></param>
        /// <returns></returns>
        public static T FromXmlFile<T>(string filePath)
        {
    
            Encoding e = Encoding.UTF8;
            return FromXmlFile<T>(filePath, e);
    
        }
    
        /// <summary>
        /// Deserialize from a file of xml useing specific encoding
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="filePath"></param>
        /// <param name="e"></param>
        /// <returns></returns>
        public static T FromXmlFile<T>(string filePath, Encoding e)
        {
            XmlSerializer s = new XmlSerializer(typeof(T));
            Object ret = null;
    
            using (TextReader r = new StreamReader(filePath, e))
            {
                ret = s.Deserialize(r);
                r.Close();
            }
    
            return (T)ret;
        }
    
      }
    
    }
    

    【讨论】:

      【解决方案3】:

      以下是我使用的几个函数,希望对您有所帮助:

      public static T FromXML<T>(string xml)
      {
        using (StringReader stringReader = new StringReader(xml))
        {
          XmlSerializer serializer = new XmlSerializer(typeof(T));
          return (T)serializer.Deserialize(stringReader);
        }
      }
      
      public string ToXML<T>(T obj)
      {
        using (StringWriter stringWriter = new StringWriter(new StringBuilder()))
        {
          XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
          xmlSerializer.Serialize(stringWriter, obj);
          return stringWriter.ToString();
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-16
        • 1970-01-01
        • 1970-01-01
        • 2011-09-28
        • 2010-10-11
        • 1970-01-01
        • 2018-10-30
        • 2015-10-25
        相关资源
        最近更新 更多