我有以下类,我正在尝试从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文件转换List。我目前循环遍历类列表并逐个节点手动创建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文件。再次,与上面的代码类似。
谢谢
答案 0 :(得分:4)
这应该是让您开始保存和加载
的一般解决方案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,因为我熟悉这些。
答案 1 :(得分:3)
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;
}
}
}
答案 2 :(得分:2)
以下是我使用的一些功能,希望它们有所帮助:
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();
}
}