爱说说技术原理:与TXT交互及MDataTable对Json的功能扩展(二)
關(guān)于愛說說在技術(shù)選型的文章見:"愛說說"技術(shù)原理方案的定選思考過程
?
本篇將講述“愛說說”比較重大的技術(shù)問題點及解決手段:
?
愛說說:http://speak.cyqdata.com/
?
雜說幾句:
一開始,原本是打算在秋式開源團隊找一JS人才來引導(dǎo)前臺頁面的呈現(xiàn)的,畢竟本人在JS還停留在原始的編碼階段,于是當(dāng)時聊了一下。
再后來,接下來幾天,由于秋式開源團隊內(nèi)部管理上有點小調(diào)整,還有新開任務(wù)小組的事,連續(xù)忙了幾天,“愛說說”就也停了幾天。
幾天過后,回到群里Call人,發(fā)現(xiàn)原來JS的人才一去無蹤影了,沒法只好自己動手了。
?
在定好技術(shù)方案后,下面開始技術(shù)的分析:
?
“愛說說”的邏輯:
前端html-》發(fā)送ajax請求-》后端ashx處理并返回Json-》前端接收Json并解析顯示?
從后端Ashx說起:
?
一:TXT文本交互的技術(shù)解析
?
1:數(shù)據(jù)寫入:每次往文本的最后面寫一條Json數(shù)據(jù),語句很簡單:
??????? public void AppendText(string appendText)??????? {
??????????? File.AppendAllText(FilePath, appendText);
??????? }
利用System.IO.File類即可輕松處理。
?
2:數(shù)據(jù)讀取:內(nèi)存表緩存失效時,需要重新加載TXT文本的Json數(shù)據(jù),語句也很簡單:
??????? public string LoadText()??????? {
??????????? return File.ReadAllText(FilePath);
??????? }
還是一行代碼,處理簡單。
?
3:刪除功能:需要移除TXT文本內(nèi)的某行Json數(shù)據(jù),也很容易的說:
??????? public void RemoveText(string removeText)??????? {
??????????? File.WriteAllText(FilePath, File.ReadAllText(FilePath).Replace(removeText, string.Empty));
??????? }
還是一行的說,讀完替換,然后重新寫入。
?
OK,和IO的交互設(shè)計,相當(dāng)?shù)暮啙?#xff0c;也就這三個函數(shù)了,寫,讀,刪除。
?
二:Json的交互的技術(shù)解析
?
1:數(shù)據(jù)如何寫入:
從上面的分析上看,提交肯定是一行一行的數(shù)據(jù),于是每次寫入都是一條Json語句。?
2:功能沖突:這和CYQ.Data.Table下的MDataTable的功能有什么沖突?
MDataTable有ToJson功能,也有LoadFromJson功能,能把數(shù)據(jù)表轉(zhuǎn)成Json,也能從Json解析還原成內(nèi)存表。
那數(shù)據(jù)行有沒有ToJson功能?答案,沒有!
替換方案可有?答案,有! 可以MDataRow.ToTable().ToJson(),即轉(zhuǎn)成表格再輸出Json,看似挺好。
在好之前,看一下MDataTable的ToJson()輸出什么?
{"count":"2","error":"","success":"true","data":[{"ID":"2","ParentID":"-1","UserID":"2","NickName":"dddd","Body":"aaddd","CreatedOn":"2011-4-24 0:22:21"},{"ID":"1","ParentID":"-1","UserID":"1","NickName":"dddd","Body":"aaaaa","CreatedOn":"2011-4-24 1:19:37"}]}格式就是這個了,前面是一些共有屬性,data內(nèi)才是數(shù)據(jù)行。
如果每次把這樣的數(shù)據(jù)寫完文本,到時候讀取解析還原成表格,肯定有問題。
?
3:如何解決沖突:擴展功能,為單獨的數(shù)據(jù)行添加ToJson()功能
只單獨輸出:
{"ID":"2","ParentID":"-1","UserID":"2","NickName":"dddd","Body":"aaddd","CreatedOn":"2011-4-24 0:22:21"}
這樣子,重復(fù)的往后寫,感覺就省了點字節(jié),而且也清爽秀多。
?
4:擴展再擴展:MDataTable.LoadFromJson要支持上
不過這么重復(fù)的寫單行Json數(shù)據(jù),再讀取,MDataTable是解析不了的,咋整?
解析不了就擴展一下,把它解析了,由于CYQ.Data的Json,都是本人手動寫的解析。
所以,修改來解析這樣一行一行的數(shù)據(jù),還是可以處理的。三改兩改就支持上了,一切很好。
?
現(xiàn)狀就是可以往TXT里寫出這么一系列的文本了:
{"ID":"1","ParentID":"-1","UserID":"1","NickName":"小樣...","Body":"愛說說...有話就說",第一個喲喲","CreatedOn":"4/20/2011 8:35:10 AM"}
{"ID":"2","ParentID":"-1","UserID":"2","NickName":"路過秋天","Body":"不知道怎么回事說,隨便來幾字,明字何期多。","CreatedOn":"4/20/2011 8:37:35 AM"}
再然后就是MDataTable.LoadFromjson又可以從這種格式還原成內(nèi)存表了。
?
技術(shù)手段到了這里,光明燦爛了。
?
一切流程很好:
1:客戶端提交數(shù)據(jù)-》
2:Ashx提交數(shù)據(jù)-》寫入內(nèi)存表,然后把數(shù)據(jù)行ToJson寫入文本。
3:內(nèi)存表在內(nèi)存,總有失效的時候,失效時LoadFromJson又還原成表格,又繼續(xù)。
?
5:另一個重大的技術(shù)問題
一切看似很好,可是后面還是會有些問題呢的,什么問題?往下看:
?
看一下表格的原始屬性:
內(nèi)在表定義:??????? private static MDataTable _Table = null;//內(nèi)存數(shù)據(jù)表?
表格的基本列:
??????????????????????? _Table.Columns.Add("ID", SqlDbType.Int);//ID標(biāo)識??????????????????????? _Table.Columns.Add("ParentID", SqlDbType.Int);//>0說明是回貼
??????????????????????? _Table.Columns.Add("UserID", SqlDbType.Int);
??????????????????????? _Table.Columns.Add("NickName", SqlDbType.NVarChar);
??????????????????????? _Table.Columns.Add("Body", SqlDbType.NVarChar);//內(nèi)容
??????????????????????? _Table.Columns.Add("CreatedOn", SqlDbType.DateTime);//創(chuàng)建日期
?
問題:
在開始定義前,都是有不同的類型的,但如果內(nèi)在表失效時,重新還原又是什么狀況?
由于Json全是字符串,在還原為內(nèi)存表MDataTable時,默認全都置為SqlDbType.NVarChar,
于是表格的字段類型全變字符串了,如果只是還原后用于綁定顯示就沒啥問題了,如果此表格還需要進行一些復(fù)雜判斷比較,就比較糾結(jié)了。
正如我要查詢ID>數(shù)字的行,全是字符串就真的很糾結(jié)。
?
如何解決?
?
想法一:有想法不是辦法:
開始糾結(jié)還原后的數(shù)據(jù)類型問題,通過判斷第一行Json的文本值,來定義設(shè)置字段類型,比如:
檢測值是數(shù)字型:就Int。
檢測值是日期型:就DateTime
最后就默認給:NVarChar
?
為何不是辦法?
看似挺好,如果文本字段內(nèi)容第一行是數(shù)字,其它行又是字符串呢?后面的內(nèi)容不就糾結(jié)了?
?
想法二:有想法也是辦法:
既然首行取值判斷不行,如果首行存表架構(gòu)呢?
首行Json字段架構(gòu)如下:
{"ID":"System.Int32","ParentID":"System.Int32","UserID":"System.Int32","NickName":"System.String","Body":"System.String","CreatedOn":"System.DateTime"}于是,解析時,就可以準(zhǔn)確的還原了,那如何輸出這行架構(gòu)行?
于是,MDataColumn也多了個ToJson功能,用于輸出表架構(gòu),至此,Json的交互方面,也大功告成了!?
三:總結(jié)
?
解決了這兩個重大的技術(shù)難題,接下來的,還有沒有其它技術(shù)問題?
有,查詢功能,即將擴展的MDataTable.Select(......)功能。?
還有沒有?
大的沒了,還有就是技術(shù)細節(jié)問題了,如:接收參數(shù),定義文本路徑,定義最大行ID等。?
下節(jié)解說,敬請期待。
?
關(guān)注點:MDataTable在“愛說說”擴展了這么多強勁的功能,啥時候發(fā)布?
很快,可能是五一前后:會在 CYQ.Data V4.5正式版中集成,也敬請期待與關(guān)注。
轉(zhuǎn)載于:https://www.cnblogs.com/cyq1162/archive/2011/04/24/2026235.html
總結(jié)
以上是生活随笔為你收集整理的爱说说技术原理:与TXT交互及MDataTable对Json的功能扩展(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Android开发从零开始》——16.
- 下一篇: 利用SOS分析调试托管代码--(1)