当前位置:首页 > C#编程 > C#/.net框架 > 正文内容

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

秋天2年前 (2022-05-09)C#/.net框架798

 

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

概述

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

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

具体如下:

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

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

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

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

涉及知识点:

  1. 序列化与反序列化

  2. 文件流的读写

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

效果图

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

image.png

核心代码

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

C#
/// <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文档代码如下:

C#
/// <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文档如下:

C#
/// <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文档如下:

C#
/// <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);
        }

备注

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

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

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


#转载请注明出处 www.skcircle.com 《少有人走的路》勇哥的工业自动化技术网站。

扫描二维码推送至手机访问。

版权声明:本文由7点博客发布,如需转载请注明出处。

本文链接:http://6dot.cn/?id=116

标签: .NET.NET框架
分享给朋友:

“C# 对象持久化,把对象保存于磁盘” 的相关文章

C#的propertygrid控件,选择和修改项目时很慢

C#的propertygrid控件,选择和修改项目时很慢

C#的propertygrid控件是很强。可以实现类似Vitual Studio属性面板那样的效果。但是。。。。我们一直痛苦它在选择和修改项目的时候很慢。我的用法是使用控件的SelectObject来绑定数据。C# PgridMotionSpeed.SelectedObject ...

C#的propertygrid控件,选择和修改项目时很慢

C#的propertygrid控件,选择和修改项目时很慢

C#的propertygrid控件是很强。可以实现类似Vitual Studio属性面板那样的效果。但是。。。。我们一直痛苦它在选择和修改项目的时候很慢。我的用法是使用控件的SelectObject来绑定数据。C# PgridMotionSpeed.SelectedObject ...

C# 当List.Find()返回一个结构体对象时,如何判断它为空?

C# 当List.Find()返回一个结构体对象时,如何判断它为空?

请看演示程序。我们知道List.Find() 如果找到则返回这个对象,找不到返回这个类型的缺省值。下面例子中,你无法这样写:            if(res1==null)        &nbs...

关于C#项目引用的一点经验

关于C#项目引用的一点经验

关于项目引用,有几种:(一)这种是引用系统的程序集(二)下面这种是引用你自己的项目“解决方案”(三)最后一种是浏览本机上的项目的dll。对于工程中有几十个项目的软件来说,虽然使用(二)是很方便。但是会编译速度奇慢,而且随着项目越多越慢。貌似他run之前都会把所有项目都试图更新一下。勇哥宿舍的电脑,实...

c#——表达式树在LINQ动态查询

c#——表达式树在LINQ动态查询

一般如果逻辑比较简单,只是存在有的情况多一个查询条件,有的情况不需要添加该查询条件简单方式这样操作就可以了C#public IQueryable<FileImport> DynamicChainedSyntax (IQueryable<FileImport&g...

C# 异步和等待,async/await

C# 异步和等待,async/await

 首先,重点是:异步将从根本上改变大多数代码的编写方式。是的,我相信 async/await 会比 LINQ 产生更大的影响。理解异步将在短短几年内成为基本必需品。关键字介绍让我们直接开始吧。我将使用一些稍后将阐述的概念——请继续阅读第一部分。异步方法看起来像这样:public ...

发表评论

访客

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