C# 對(duì)象持久化詳解
對(duì)象持久化是指將內(nèi)存中的對(duì)象保存到可永久保存的存儲(chǔ)設(shè)備中(如磁盤)的一種技術(shù)。
本文介紹的是除數(shù)據(jù)庫(kù)之外的幾種對(duì)象持久化方式。
具體如下:
- 保存成文本:即將內(nèi)存對(duì)象以字節(jié)流的方式保存到文本中。
- 序列化成Xml:即將對(duì)象以Xml的格式存儲(chǔ)。
- 序列化成Json:即將對(duì)象序列化成Json對(duì)象,然后存儲(chǔ)。
- 序列化成二進(jìn)制:即將對(duì)象序列化成二進(jìn)制字節(jié)流保存到文件中。
涉及知識(shí)點(diǎn):
- 序列化與反序列化
- 文件流的讀寫
- ListView顯示復(fù)選框,并橫向排列
如下圖所示【主要功能是將用戶輸入的信息保存成各種格式,并從各個(gè)文檔中進(jìn)行讀取出來(lái)】:

保存和讀取文本文檔代碼如下:
/// <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關(guān)鍵字,會(huì)自動(dòng)釋放
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關(guān)鍵字,會(huì)自動(dòng)釋放
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);
//對(duì)時(shí)間進(jìn)行處理,需要引用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); //對(duì)時(shí)間進(jìn)行處理
Regex reg = new Regex(strRegex);
strJson = reg.Replace(strJson, evaluator);
p = jserializer.Deserialize<Person>(strJson);
}
}
SetPersonInfos(p);
}
保存和讀取Bin文檔如下:
/// <summary>
/// 保存成二進(jìn)制文件
/// </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>
/// 讀取二進(jìn)制文件
/// </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);
}
備注:其實(shí)對(duì)象持久化和對(duì)象序列化是兩個(gè)不同的概念。兩者有關(guān)聯(lián)卻不同。
對(duì)象持久化:是使對(duì)象可以保存到實(shí)體存儲(chǔ)介質(zhì)中,在對(duì)象生命周期結(jié)束后可以再現(xiàn)。
對(duì)象序列化:是將對(duì)象或者數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化成特定的格式,使其可在網(wǎng)絡(luò)中傳輸,或者可存儲(chǔ)在內(nèi)存或者文件中。
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
- C#使用SqlDataAdapter對(duì)象獲取數(shù)據(jù)的方法
- 詳解C#中使用對(duì)象或集合的初始值設(shè)定項(xiàng)初始化的操作
- C#編程中使用ref和out關(guān)鍵字來(lái)傳遞數(shù)組對(duì)象的用法
- C#編程實(shí)現(xiàn)對(duì)象與JSON串互相轉(zhuǎn)換實(shí)例分析
- C#實(shí)現(xiàn)獲取不同對(duì)象中名稱相同屬性的方法
- C#中Cookie之存儲(chǔ)對(duì)象
- C#中使用反射遍歷一個(gè)對(duì)象屬性及值的小技巧
- C#查找對(duì)象在ArrayList中出現(xiàn)位置的方法
- C#檢查指定對(duì)象是否存在于ArrayList集合中的方法
- 淺談對(duì)c# 面向?qū)ο蟮睦斫?/a>
相關(guān)文章
C#?CefSharp?根據(jù)輸入日期段自動(dòng)選擇日期的操作代碼
這篇文章主要介紹了C#?CefSharp?根據(jù)輸入日期段自動(dòng)選擇日期的操作代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01
C#中把任意類型的泛型集合轉(zhuǎn)換成SQLXML數(shù)據(jù)格式的實(shí)例
本文主要分享了C#中把任意類型的泛型集合轉(zhuǎn)換成SQLXML數(shù)據(jù)格式的實(shí)例代碼。具有很好的參考價(jià)值,需要的朋友可以看下2016-12-12
C#/VB.NET實(shí)現(xiàn)將Html轉(zhuǎn)為Word的示例詳解
本文分享以C#程序代碼為例,實(shí)現(xiàn)將Html文件轉(zhuǎn)換Word文檔的方法(附VB.NET代碼)。在實(shí)際轉(zhuǎn)換場(chǎng)景中可參考本文的方法,感興趣的可以了解一下2022-07-07
淺析WPF中控件拖拽與拖動(dòng)的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了如何在WPF中實(shí)現(xiàn)控件拖拽與拖動(dòng)的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12
c# winform窗口一直置頂顯示在桌面最上方或最底層的方法
winform窗口一直置頂顯示在桌面最上方,這樣的功能真的很實(shí)用的,很多的軟件窗口都有這樣的功能,本文也來(lái)實(shí)現(xiàn)一個(gè),感興趣的你千萬(wàn)不要錯(cuò)過了,希望本文對(duì)你有所幫助2013-01-01
Unity實(shí)現(xiàn)卡牌翻動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)卡牌翻動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02

