Winform中实现序列化指定类型的对象到指定的Xml文件和从指定的Xml文件中反序列化指定类型的对象
場景
在Winform程序中需要將某些頁面的設置存儲到配置文件中,下次再次打開時通過配置文件讀取,點擊確定時能將將設置保存到配置文件中。
之前介紹過
Winform中自定義xml配置文件后對節點進行讀取與寫入:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100532137
下面是用System.Xml.Serialization實現的方式
注:
博客主頁:
https://blog.csdn.net/badao_liumang_qizhi
關注公眾號
霸道的程序猿
獲取編程相關電子書、教程推送與免費下載
實現
首先新建一個實體類DataItem,并標識可以序列化
??? [Serializable]public class DataItem{public DataItem(){this.DisplayIndex = -1;}/// <summary>/// 項索引/// </summary>public int ItemIndex { get; set; }/// <summary>/// 關聯的數據屬性/// </summary>public string DataPropertyName { get; set; }/// <summary>/// 顯示的名稱/// </summary>public string DisplayName { get; set; }/// <summary>/// 顯示寬度(列寬)/// </summary>public int DisplayWidth { get; set; }/// <summary>/// 顯示精度(小數位數)/// </summary>public int DisplayPrecision { get; set; }/// <summary>/// 是否顯示/// </summary>public bool IsDisplay { get; set; }/// <summary>/// 是否按空值顯示/// </summary>public bool IsDisplayNullValue { get; set; }/// <summary>/// 顯示位置索引/// </summary>public int DisplayIndex { get; set; }/// <summary>/// 是否導出/// </summary>public bool NeedExport = true;}實現將對象序列化為xml文件
首先獲取上面DataItem的list,以及要保存的文件路徑
然后新建一個工具類方法,實現對象序列化
??????? /// <summary>/// 序列化指定類型的對象到指定的Xml文件/// </summary>/// <typeparam name="T">要序列化的對象類型</typeparam>/// <param name="obj">要序列化的對象</param>/// <param name="xmlFileName">保存對象數據的完整文件名</param>public static void SerializeXml<T>(T obj, string xmlFileName){lock (xmlFileName){try{string dir = Path.GetDirectoryName(xmlFileName);?????? //獲取文件路徑if (!Directory.Exists(dir)){Directory.CreateDirectory(dir);}string xmlContent = SerializeObject<T>(obj);FileHelper.WriteFile(xmlFileName, xmlContent, System.Text.Encoding.UTF8);}catch (Exception ex){Console.Write(ex);}}}在此工具類方法中調用了SerializeObject將對象序列化為xml對象的方法
??????? /// <summary>/// 把對象序列化為xml字符串/// </summary>/// <typeparam name="T"></typeparam>/// <param name="obj"></param>/// <returns></returns>public static string SerializeObject<T>(T obj){if (obj != null){StringWriter strWriter = new StringWriter();XmlSerializer serializer = new XmlSerializer(typeof(T));serializer.Serialize(strWriter, obj);return strWriter.ToString();}else{return String.Empty;}}在此工具類方法中還調用了文件工具類的一個方法WriteFile
??????? /// <summary>/// 向指定文件寫入內容/// </summary>/// <param name="path">要寫入內容的文件完整路徑</param>/// <param name="content">要寫入的內容</param>/// <param name="encoding">編碼格式</param>public static void WriteFile(string path, string content, System.Text.Encoding encoding){try{object obj = new object();if (!System.IO.File.Exists(path)){System.IO.FileStream fileStream = System.IO.File.Create(path);fileStream.Close();}lock (obj){using (System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(path, false, encoding)){streamWriter.WriteLine(content);streamWriter.Close();streamWriter.Dispose();}}}catch (System.Exception ex){Console.Write(ex);}}然后調用工具類方法SerializeXml并傳遞要序列化的對象的list和要序列化的文件的路徑
文件路徑要傳遞類似于以下這種
D:\Main\Test\bin\Debug\Data\Viewer\Config\badao.xml序列化調用示例
SerializeXml<List<DataItem>>(_recordDataItems, this.filepathRecord);其中第一個參數是DataItem的list,第二個參數是序列化的文件路徑
序列化之后的文件示例:
<?xml version="1.0" encoding="utf-16"?> <ArrayOfDataItem xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><DataItem><NeedExport>true</NeedExport><ItemIndex>0</ItemIndex><DataPropertyName>DataPoint</DataPropertyName><DisplayName>記錄序號</DisplayName><DisplayWidth>9</DisplayWidth><DisplayPrecision>0</DisplayPrecision><IsDisplay>true</IsDisplay><IsDisplayNullValue>false</IsDisplayNullValue><DisplayIndex>0</DisplayIndex></DataItem><DataItem><NeedExport>true</NeedExport><ItemIndex>1</ItemIndex><DataPropertyName>RecordTime</DataPropertyName><DisplayName>記錄時間</DisplayName><DisplayWidth>9</DisplayWidth><DisplayPrecision>0</DisplayPrecision><IsDisplay>true</IsDisplay><IsDisplayNullValue>false</IsDisplayNullValue><DisplayIndex>1</DisplayIndex></DataItem> </ArrayOfDataItem>將XML反序列化為對象
同上在工具類中新建工具類方法DeserializeXml
??????? /// <summary>/// 從指定的Xml文件中反序列化指定類型的對象/// </summary>/// <typeparam name="T">反序列化的對象類型</typeparam>/// <param name="xmlFileName">保存對象數據的文件名</param>/// <returns>返回反序列化出的對象實例</returns>public static T DeserializeXml<T>(string xmlFileName){lock (xmlFileName){try{if (!File.Exists(xmlFileName)){Console.Write("序列化文件不存在!");return default(T);}else{string xmlContent = FileHelper.ReadFile(xmlFileName, System.Text.Encoding.UTF8);T obj = DeserializeObject<T>(xmlContent);return obj;}}catch (Exception ex){Console.Write(ex);return default(T);}}}然后在此工具類方法中調用了DeserializeObject把xml字符串反序列化為對象的方法
??????? /// <summary>/// 把xml字符串反序列化為對象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="xmlString"></param>/// <returns></returns>public static T DeserializeObject<T>(string xmlString){if (!String.IsNullOrEmpty(xmlString)){StringReader strReader = new StringReader(xmlString);XmlSerializer serializer = new XmlSerializer(typeof(T));T obj = (T)serializer.Deserialize(strReader);return obj;}else{return default(T);}}以及讀取文件的方法ReadFile
??????? /// <summary>/// 讀取文件內容/// </summary>/// <param name="path">要讀取的文件路徑</param>/// <param name="encoding">編碼格式</param>/// <returns>返回文件內容</returns>public static string ReadFile(string path, System.Text.Encoding encoding){string result;if (!System.IO.File.Exists(path)){result = "不存在相應的目錄";}else{System.IO.FileStream stream = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite);System.IO.StreamReader streamReader = new System.IO.StreamReader(stream, encoding);result = streamReader.ReadToEnd();streamReader.Close();streamReader.Dispose();}return result;}調用方法示例
recordDataItems =DeserializeXml<List<DataItem>>(this.filepathRecord);其中返回值接受是使用的List<DataItem>參數傳值的是xml配置文件的全路徑
?
?
總結
以上是生活随笔為你收集整理的Winform中实现序列化指定类型的对象到指定的Xml文件和从指定的Xml文件中反序列化指定类型的对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Electron中打开和关闭子窗口以及子
- 下一篇: NuGet(微软.NET开发平台的软件包