基于WPF MVVM模式下,考虑对数据有临时存储的需求,进而做序列化处理。
注意点:单独创建1个需要进行序列化类,增加只需要做序列化的数据,避免踩坑。
Model(模型):
public class SerializeCtModel //序列化模式类
{
public byte XXX { get; set; }
根据需要添加相应的属性字段...
}
ViewModel(视图模型):
public RelayCommand<Window> CreateTrainCmd { get; }
private CreateTrainModel createModel ;
public CreateTrainModel CreateModel
{
get
{
/*文件存在时,反序列化至对象*/
if (FileUtils.CheckFileExist(XmlFilePath))
{
SerializeCtModel sctModel = FileUtils.DeserializeFromXML<SerializeCtModel>(XmlFilePath);
BeanUtils.copyProperties(sctModel, createModel);
}
return createModel;
}
//get => createModel;
set {
createModel = value;
RaisePropertyChanged(); }
}
private void CreateTrainCmd()
{
if (FileUtils.CheckFileExist(XmlFilePath)) //序列化前要删除文件,因为序列化可能导致文件不符合XML规范,导致反序列化解析错误,原因不明
{
FileUtils.DeleteFile(XmlFilePath);
}
SerializeCtModel sctModel = new SerializeCtModel();
BeanUtils.copyProperties(CreateModel, sctModel);
FileUtils.SerializeToXML(sctModel, XmlFilePath);
}
}
工具类:
/// <summary>
/// 序列化对象到XML文件中
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <param name="filePath"></param>
public static void SerializeToXML<T>(T obj, string filePath)
{
try
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (StreamWriter writer = new StreamWriter(filePath))
{
serializer.Serialize(writer, obj);
}
}
catch (Exception ex)
{
string msg = "序列化处理失败,失败原因:\r\n" + ex.Message;
if (ex.InnerException != null)
{
msg += "\r\n具体原因:\r\n" + ex.InnerException.Message;
}
MessageBox.Show(msg);
}
}
/// <summary>
/// 从XML文件反序列化到对象中
/// </summary>
/// <param name="filePath"></param>
public static T DeserializeFromXML<T>(string filePath)
{
try
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (StreamReader reader = new StreamReader(filePath))
{
return (T)serializer.Deserialize(reader);
}
}
catch (Exception ex)
{
string msg = "反序列化处理失败,失败原因:\r\n" + ex.Message;
if (ex.InnerException != null)
{
msg += "\r\n具体原因:\r\n" + ex.InnerException.Message;
}
MessageBox.Show(msg);
return default(T);
}
}