c# 序列化与反序列化

基于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);
            }
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值