在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;
}
///
/// 项索引
///
public int ItemIndex { get; set; }
///
/// 关联的数据属性
///
public string DataPropertyName { get; set; }
///
/// 显示的名称
///
public string DisplayName { get; set; }
///
/// 显示宽度(列宽)
///
public int DisplayWidth { get; set; }
///
/// 显示精度(小数位数)
///
public int DisplayPrecision { get; set; }
///
/// 是否显示
///
public bool IsDisplay { get; set; }
///
/// 是否按空值显示
///
public bool IsDisplayNullValue { get; set; }
///
/// 显示位置索引
///
public int DisplayIndex { get; set; }
///
/// 是否导出
///
public bool NeedExport = true;
}
首先获取上面DataItem的list,以及要保存的文件路径
然后新建一个工具类方法,实现对象序列化
///
/// 序列化指定类型的对象到指定的Xml文件
///
/// 要序列化的对象类型
/// 要序列化的对象
/// 保存对象数据的完整文件名
public static void SerializeXml(T obj, string xmlFileName)
{
lock (xmlFileName)
{
try
{
string dir = Path.GetDirectoryName(xmlFileName); //获取文件路径
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
string xmlContent = SerializeObject(obj);
FileHelper.WriteFile(xmlFileName, xmlContent, System.Text.Encoding.UTF8);
}
catch (Exception ex)
{
Console.Write(ex);
}
}
}
在此工具类方法中调用了SerializeObject将对象序列化为xml对象的方法
///
/// 把对象序列化为xml字符串
///
///
///
///
public static string SerializeObject(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
///
/// 向指定文件写入内容
///
/// 要写入内容的文件完整路径
/// 要写入的内容
/// 编码格式
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>(_recordDataItems, this.filepathRecord);
其中第一个参数是DataItem的list,第二个参数是序列化的文件路径
序列化之后的文件示例:
true
0
DataPoint
记录序号
9
0
true
false
0
true
1
RecordTime
记录时间
9
0
true
false
1
同上在工具类中新建工具类方法DeserializeXml
///
/// 从指定的Xml文件中反序列化指定类型的对象
///
/// 反序列化的对象类型
/// 保存对象数据的文件名
/// 返回反序列化出的对象实例
public static T DeserializeXml(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(xmlContent);
return obj;
}
}
catch (Exception ex)
{
Console.Write(ex);
return default(T);
}
}
}
然后在此工具类方法中调用了DeserializeObject把xml字符串反序列化为对象的方法
///
/// 把xml字符串反序列化为对象
///
///
///
///
public static T DeserializeObject(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
///
/// 读取文件内容
///
/// 要读取的文件路径
/// 编码格式
/// 返回文件内容
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>(this.filepathRecord);
其中返回值接受是使用的List