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# OpenCvSharp利用白平衡技術(shù)實(shí)現(xiàn)圖像修復(fù)功能
這篇文章主要為大家詳細(xì)介紹了C# OpenCvSharp如何利用白平衡技術(shù)實(shí)現(xiàn)圖像修復(fù)功能,文中的示例代碼講解詳細(xì),希望對(duì)大家有一定的幫助2024-02-02
C#引用類型轉(zhuǎn)換的常見(jiàn)方式總結(jié)
這篇文章主要介紹了C#引用類型轉(zhuǎn)換的常見(jiàn)方式,包括子類轉(zhuǎn)換成父類,父類轉(zhuǎn)換成子類,以及不是子父級(jí)關(guān)系類之間的轉(zhuǎn)換,需要的朋友可以參考下2014-09-09
C# string轉(zhuǎn)換為幾種不同編碼的Byte[]的問(wèn)題解讀
這篇文章主要介紹了C# string轉(zhuǎn)換為幾種不同編碼的Byte[]的問(wèn)題解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
C# DataTable中查詢指定字段名稱的數(shù)據(jù)
這篇文章主要介紹了C# DataTable中查詢指定字段名稱的數(shù)據(jù),本文直接給出實(shí)例代碼,簡(jiǎn)單易懂,需要的朋友可以參考下2015-06-06

