一開(kāi)始,原本是打算在秋式開(kāi)源團(tuán)隊(duì)找一JS人才來(lái)引導(dǎo)前臺(tái)頁(yè)面的呈現(xiàn)的,畢竟本人在JS還停留在原始的編碼階段,于是當(dāng)時(shí)聊了一下。
再后來(lái),接下來(lái)幾天,由于秋式開(kāi)源團(tuán)隊(duì)內(nèi)部管理上有點(diǎn)小調(diào)整,還有新開(kāi)任務(wù)小組的事,連續(xù)忙了幾天,“愛(ài)說(shuō)說(shuō)”就也停了幾天。
幾天過(guò)后,回到群里Call人,發(fā)現(xiàn)原來(lái)JS的人才一去無(wú)蹤影了,沒(méi)法只好自己動(dòng)手了。
在定好技術(shù)方案后,下面開(kāi)始技術(shù)的分析:
“愛(ài)說(shuō)說(shuō)”的邏輯:
前端html-》發(fā)送ajax請(qǐng)求-》后端ashx處理并返回Json-》前端接收J(rèn)son并解析顯示
從后端Ashx說(shuō)起:
一:TXT文本交互的技術(shù)解析
1:數(shù)據(jù)寫(xiě)入:每次往文本的最后面寫(xiě)一條Json數(shù)據(jù),語(yǔ)句很簡(jiǎn)單:
public void AppendText(string appendText)
{
File.AppendAllText(FilePath, appendText);
}
利用System.IO.File類即可輕松處理。
2:數(shù)據(jù)讀。簝(nèi)存表緩存失效時(shí),需要重新加載TXT文本的Json數(shù)據(jù),語(yǔ)句也很簡(jiǎn)單:
public string LoadText()
{
return File.ReadAllText(FilePath);
}
還是一行代碼,處理簡(jiǎn)單。
3:刪除功能:需要移除TXT文本內(nèi)的某行Json數(shù)據(jù),也很容易的說(shuō):
public void RemoveText(string removeText)
{
File.WriteAllText(FilePath, File.ReadAllText(FilePath).Replace(removeText, string.Empty));
}
還是一行的說(shuō),讀完替換,然后重新寫(xiě)入。
OK,和IO的交互設(shè)計(jì),相當(dāng)?shù)暮?jiǎn)潔,也就這三個(gè)函數(shù)了,寫(xiě),讀,刪除。
二:Json的交互的技術(shù)解析
1:數(shù)據(jù)如何寫(xiě)入:
從上面的分析上看,提交肯定是一行一行的數(shù)據(jù),于是每次寫(xiě)入都是一條Json語(yǔ)句。
2:功能沖突:這和CYQ.Data.Table下的MDataTable的功能有什么沖突?
MDataTable有ToJson功能,也有LoadFromJson功能,能把數(shù)據(jù)表轉(zhuǎn)成Json,也能從Json解析還原成內(nèi)存表。
那數(shù)據(jù)行有沒(méi)有ToJson功能?答案,沒(méi)有!
替換方案可有?答案,有! 可以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"}]}
格式就是這個(gè)了,前面是一些共有屬性,data內(nèi)才是數(shù)據(jù)行。
如果每次把這樣的數(shù)據(jù)寫(xiě)完文本,到時(shí)候讀取解析還原成表格,肯定有問(wèn)題。
3:如何解決沖突:擴(kuò)展功能,為單獨(dú)的數(shù)據(jù)行添加ToJson()功能
只單獨(dú)輸出:
{"ID":"2","ParentID":"-1","UserID":"2","NickName":"dddd","Body":"aaddd","CreatedOn":"2011-4-24 0:22:21"}
這樣子,重復(fù)的往后寫(xiě),感覺(jué)就省了點(diǎn)字節(jié),而且也清爽秀多。
4:擴(kuò)展再擴(kuò)展:MDataTable.LoadFromJson要支持上
不過(guò)這么重復(fù)的寫(xiě)單行Json數(shù)據(jù),再讀取,MDataTable是解析不了的,咋整?
解析不了就擴(kuò)展一下,把它解析了,由于CYQ.Data的Json,都是本人手動(dòng)寫(xiě)的解析。
所以,修改來(lái)解析這樣一行一行的數(shù)據(jù),還是可以處理的。三改兩改就支持上了,一切很好。
現(xiàn)狀就是可以往TXT里寫(xiě)出這么一系列的文本了:
{"ID":"1","ParentID":"-1","UserID":"1","NickName":"小樣...","Body":"愛(ài)說(shuō)說(shuō)...有話就說(shuō)",第一個(gè)喲喲","CreatedOn":"4/20/2011 8:35:10 AM"}
{"ID":"2","ParentID":"-1","UserID":"2","NickName":"路過(guò)秋天","Body":"不知道怎么回事說(shuō),隨便來(lái)幾字,明字何期多。","CreatedOn":"4/20/2011 8:37:35 AM"}
再然后就是MDataTable.LoadFromjson又可以從這種格式還原成內(nèi)存表了。
技術(shù)手段到了這里,光明燦爛了。
一切流程很好:
1:客戶端提交數(shù)據(jù)-》
2:Ashx提交數(shù)據(jù)-》寫(xiě)入內(nèi)存表,然后把數(shù)據(jù)行ToJson寫(xiě)入文本。
3:內(nèi)存表在內(nèi)存,總有失效的時(shí)候,失效時(shí)LoadFromJson又還原成表格,又繼續(xù)。
5:另一個(gè)重大的技術(shù)問(wèn)題
一切看似很好,可是后面還是會(huì)有些問(wèn)題呢的,什么問(wèn)題?往下看:
看一下表格的原始屬性:
內(nèi)在表定義: private static MDataTable _Table = null;//內(nèi)存數(shù)據(jù)表
表格的基本列:
_Table.Columns.Add("ID", SqlDbType.Int);//ID標(biāo)識(shí)
_Table.Columns.Add("ParentID", SqlDbType.Int);//>0說(shuō)明是回貼
_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)建日期
問(wèn)題:
在開(kāi)始定義前,都是有不同的類型的,但如果內(nèi)在表失效時(shí),重新還原又是什么狀況?
由于Json全是字符串,在還原為內(nèi)存表MDataTable時(shí),默認(rèn)全都置為SqlDbType.NVarChar,
于是表格的字段類型全變字符串了,如果只是還原后用于綁定顯示就沒(méi)啥問(wèn)題了,如果此表格還需要進(jìn)行一些復(fù)雜判斷比較,就比較糾結(jié)了。
正如我要查詢ID>數(shù)字的行,全是字符串就真的很糾結(jié)。
如何解決?
想法一:有想法不是辦法:
開(kāi)始糾結(jié)還原后的數(shù)據(jù)類型問(wèn)題,通過(guò)判斷第一行Json的文本值,來(lái)定義設(shè)置字段類型,比如:
檢測(cè)值是數(shù)字型:就Int。
檢測(cè)值是日期型:就DateTime
最后就默認(rèn)給: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"}
于是,解析時(shí),就可以準(zhǔn)確的還原了,那如何輸出這行架構(gòu)行?
于是,MDataColumn也多了個(gè)ToJson功能,用于輸出表架構(gòu),至此,Json的交互方面,也大功告成了!
三:總結(jié)
解決了這兩個(gè)重大的技術(shù)難題,接下來(lái)的,還有沒(méi)有其它技術(shù)問(wèn)題?
有,查詢功能,即將擴(kuò)展的MDataTable.Select(......)功能。
還有沒(méi)有?
大的沒(méi)了,還有就是技術(shù)細(xì)節(jié)問(wèn)題了,如:接收參數(shù),定義文本路徑,定義最大行ID等。