簡體   English   中英

C#反序列化xml文件以形成List <T>

[英]C# deserialize xml file to form List<T>

我有以下類,我正在嘗試從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);

}

我遇到的問題是找到一種可靠的方法將List轉換為XML文件和從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文件。 再次,以與上面的代碼類似的方式。

謝謝

這應該是一個通用的解決方案,讓您開始保存和加載

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,因為我熟悉這些。

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;
    }

  }

}

這是我使用的幾個函數,希望它們有所幫助:

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();
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM