C# 对象持久化详解
程序员文章站
2023-10-31 12:14:04
对象持久化是指将内存中的对象保存到可永久保存的存储设备中(如磁盘)的一种技术。
本文介绍的是除数据库之外的几种对象持久化方式。
具体如下:
保存成文本:即将内...
对象持久化是指将内存中的对象保存到可永久保存的存储设备中(如磁盘)的一种技术。
本文介绍的是除数据库之外的几种对象持久化方式。
具体如下:
- 保存成文本:即将内存对象以字节流的方式保存到文本中。
- 序列化成xml:即将对象以xml的格式存储。
- 序列化成json:即将对象序列化成json对象,然后存储。
- 序列化成二进制:即将对象序列化成二进制字节流保存到文件中。
涉及知识点:
- 序列化与反序列化
- 文件流的读写
- listview显示复选框,并横向排列
如下图所示【主要功能是将用户输入的信息保存成各种格式,并从各个文档中进行读取出来】:
保存和读取文本文档代码如下:
/// <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); }
备注:其实对象持久化和对象序列化是两个不同的概念。两者有关联却不同。
对象持久化:是使对象可以保存到实体存储介质中,在对象生命周期结束后可以再现。
对象序列化:是将对象或者数据结构转化成特定的格式,使其可在网络中传输,或者可存储在内存或者文件中。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!