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

保存和讀取文本文檔代碼如下:
/// <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)鍵字,會自動釋放
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)鍵字,會自動釋放
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);
}
備注:其實對象持久化和對象序列化是兩個不同的概念。兩者有關(guān)聯(lián)卻不同。
對象持久化:是使對象可以保存到實體存儲介質(zhì)中,在對象生命周期結(jié)束后可以再現(xiàn)。
對象序列化:是將對象或者數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化成特定的格式,使其可在網(wǎng)絡(luò)中傳輸,或者可存儲在內(nèi)存或者文件中。
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
相關(guān)文章
C#?CefSharp?根據(jù)輸入日期段自動選擇日期的操作代碼
這篇文章主要介紹了C#?CefSharp?根據(jù)輸入日期段自動選擇日期的操作代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01
C#中把任意類型的泛型集合轉(zhuǎn)換成SQLXML數(shù)據(jù)格式的實例
本文主要分享了C#中把任意類型的泛型集合轉(zhuǎn)換成SQLXML數(shù)據(jù)格式的實例代碼。具有很好的參考價值,需要的朋友可以看下2016-12-12
C#/VB.NET實現(xiàn)將Html轉(zhuǎn)為Word的示例詳解
本文分享以C#程序代碼為例,實現(xiàn)將Html文件轉(zhuǎn)換Word文檔的方法(附VB.NET代碼)。在實際轉(zhuǎn)換場景中可參考本文的方法,感興趣的可以了解一下2022-07-07
c# winform窗口一直置頂顯示在桌面最上方或最底層的方法
winform窗口一直置頂顯示在桌面最上方,這樣的功能真的很實用的,很多的軟件窗口都有這樣的功能,本文也來實現(xiàn)一個,感興趣的你千萬不要錯過了,希望本文對你有所幫助2013-01-01

