C# 对象持久化,把对象保存于磁盘

本文以一个简单的小例子,简述对象持久化的相关知识,仅供学习分享使用,如有不足之处,还请指正。

概述

对象持久化是指将内存中的对象保存到可永久保存的存储设备中(如磁盘)的一种技术。

本文介绍的是除数据库之外的几种对象持久化方式。

具体如下:

  1. 保存成文本:即将内存对象以字节流的方式保存到文本中。

  2. 序列化成Xml:即将对象以Xml的格式存储。

  3. 序列化成Json:即将对象序列化成Json对象,然后存储。

  4. 序列化成二进制:即将对象序列化成二进制字节流保存到文件中。

涉及知识点:

  1. 序列化与反序列化

  2. 文件流的读写

  3. ListView显示复选框,并横向排列

效果图

如下图所示【主要功能是将用户输入的信息保存成各种格式,并从各个文档中进行读取出来】:

image.png

核心代码

保存和读取文本文档代码如下:

/// <summary>
        /// 保存成文本
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSaveTxt_Click(object sender, EventArgs e)
        {
            Dictionary<string, string> dicInfos  = GetDictionaryInfos();
            string filePath = "objPerson.txt";
            //采用using关键字,会自动释放
            using (FileStream fs = new FileStream(filePath, FileMode.Create))
            {
                using (StreamWriter sw = new StreamWriter(fs, Encoding.Default))
                {
                    foreach (var keyPair in dicInfos)
                    {
                        sw.WriteLine(string.Format("{0}={1}", keyPair.Key, keyPair.Value));
                    }
                }
            }
        }

        /// <summary>
        /// 从文本中读取
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnReadTxt_Click(object sender, EventArgs e)
        {
            string filePath = "objPerson.txt";
            Dictionary<string, string> dic = new Dictionary<string, string>();
            //采用using关键字,会自动释放
            using (FileStream fs = new FileStream(filePath, FileMode.Open))
            {
                using (StreamReader sw = new StreamReader(fs, Encoding.Default))
                {
                    while (!sw.EndOfStream) {
                        string lineInfo = sw.ReadLine();
                        dic.Add(lineInfo.Split('=')[0], lineInfo.Split('=')[1]);
                    }
                }
            }
            this.txtName.Text = dic["Name"];
            this.dtBirthday.Text = dic["Birthday"];
            if (dic["Gender"] == this.rbBoy.Text)
            {
                this.rbBoy.Checked = true;
            }
            else {
                this.rbGirl.Checked = true;
            }
            string[] loves = dic["Love"].Split('|');
            foreach (var love in loves)
            {
                foreach (var item in this.lsvLove.Items)
                {
                    ListViewItem li = item as ListViewItem;
                    if (li.Text == love)
                    {
                        li.Checked = true;
                    }
                }
            }
        }

保存和读取Xml文档代码如下:

/// <summary>
        /// 保存成Xml
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSaveXml_Click(object sender, EventArgs e)
        {
            Person p = GetPersonInfos();
            string filePath = "objPerson.xml";
            using (FileStream fs = new FileStream(filePath, FileMode.Create))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(Person));
                serializer.Serialize(fs, p);
            }
        }

        /// <summary>
        /// 从Xml中读取
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnReadXml_Click(object sender, EventArgs e)
        {
            string filePath = "objPerson.xml";
            Person p;
            using (FileStream fs = new FileStream(filePath, FileMode.Open))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(Person));
                object obj= serializer.Deserialize(fs);
                p = obj as Person;
            }
            SetPersonInfos(p);
        }

保存和读取Json文档如下:

/// <summary>
        /// 保存成Json
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSaveJson_Click(object sender, EventArgs e)
        {
            Person p = GetPersonInfos();
            JavaScriptSerializer jserializer = new JavaScriptSerializer();
            string strJson = jserializer.Serialize(p);
            string strRegex  = @"\\/Date\((\d+)\)\\/";
            MatchEvaluator evaluator = new MatchEvaluator(ConvertJsonDateToDateString);

            //对时间进行处理,需要引用System.Text.RegularExpressions;命名空间
            Regex reg = new Regex(strRegex);
            strJson = reg.Replace(strJson, evaluator);

            string filePath = "objPerson.json";
            using (FileStream fs = new FileStream(filePath, FileMode.Create))
            {
                using (StreamWriter sw = new StreamWriter(fs, Encoding.Default))
                {
                    sw.Write(strJson);
                }
            }
        }

        /// <summary>
        /// 从Json中读取
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnReadJson_Click(object sender, EventArgs e)
        {
            JavaScriptSerializer jserializer = new JavaScriptSerializer();
            string filePath = "objPerson.json";
            Person p;
            using (FileStream fs = new FileStream(filePath, FileMode.Open))
            {
                using (StreamReader sw = new StreamReader(fs, Encoding.Default))
                {
                    string strJson = sw.ReadToEnd();
                    string strRegex = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}";
                    MatchEvaluator evaluator = new MatchEvaluator(ConvertDateStringToJsonDate);    //对时间进行处理
                    Regex reg = new Regex(strRegex);
                    strJson = reg.Replace(strJson, evaluator);
                    p = jserializer.Deserialize<Person>(strJson);
                }
            }
            SetPersonInfos(p);
        }

保存和读取Bin文档如下:

/// <summary>
        /// 保存成二进制文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSaveBin_Click(object sender, EventArgs e)
        {
            Person p = GetPersonInfos();
            string filePath = "objPerson.bin";
            using (FileStream fs = new FileStream(filePath, FileMode.Create)) {
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(fs, p);
            }
        }

        /// <summary>
        /// 读取二进制文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnReadBin_Click(object sender, EventArgs e)
        {
            string filePath = "objPerson.bin";
            Person p;
            using (FileStream fs = new FileStream(filePath, FileMode.Open))
            {
                BinaryFormatter bf = new BinaryFormatter();
                p= bf.Deserialize(fs) as Person;
            }
            SetPersonInfos(p);
        }

备注

其实对象持久化和对象序列化是两个不同的概念。两者有关联却不同。

对象持久化:是使对象可以保存到实体存储介质中,在对象生命周期结束后可以再现。

对象序列化:是将对象或者数据结构转化成特定的格式,使其可在网络中传输,或者可存储在内存或者文件中。


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864