愛說說技術原理:與TXT互動及MDataTable對Json的功能擴充套件(二)
關於愛說說在技術選型的文章見:愛說說技術原理方案的定選思考過程
本篇將講述“愛說說”比較重大的技術問題點及解決手段:
雜說幾句:
一開始,原本是打算在秋式開源團隊找一JS人才來引導前臺頁面的呈現的,畢竟本人在JS還停留在原始的編碼階段,於是當時聊了一下。
再後來,接下來幾天,由於秋式開源團隊內部管理上有點小調整,還有新開任務小組的事,連續忙了幾天,“愛說說”就也停了幾天。
幾天過後,回到群裡Call人,發現原來JS的人才一去無蹤影了,沒法只好自己動手了。
在定好技術方案後,下面開始技術的分析:
“愛說說”的邏輯:
前端html-》傳送ajax請求-》後端ashx處理並返回Json-》前端接收Json並解析顯示
從後端Ashx說起:
一:TXT文字互動的技術解析
1:資料寫入:每次往文字的最後面寫一條Json資料,語句很簡單:
public void AppendText(string appendText)
{
File.AppendAllText(FilePath, appendText);
}
{
File.AppendAllText(FilePath, appendText);
}
利用System.IO.File類即可輕鬆處理。
2:資料讀取:記憶體表快取失效時,需要重新載入TXT文字的Json資料,語句也很簡單:
public string LoadText()
{
return File.ReadAllText(FilePath);
}
{
return File.ReadAllText(FilePath);
}
還是一行程式碼,處理簡單。
3:刪除功能:需要移除TXT文字內的某行Json資料,也很容易的說:
public void RemoveText(string removeText)
{
File.WriteAllText(FilePath, File.ReadAllText(FilePath).Replace(removeText, string.Empty));
}
{
File.WriteAllText(FilePath, File.ReadAllText(FilePath).Replace(removeText, string.Empty));
}
還是一行的說,讀完替換,然後重新寫入。
OK,和IO的互動設計,相當的簡潔,也就這三個函式了,寫,讀,刪除。
二:Json的互動的技術解析
1:資料如何寫入:
從上面的分析上看,提交肯定是一行一行的資料,於是每次寫入都是一條Json語句。
2:功能衝突:這和CYQ.Data.Table下的MDataTable的功能有什麼衝突?
MDataTable有ToJson功能,也有LoadFromJson功能,能把資料錶轉成Json,也能從Json解析還原成記憶體表。
那資料行有沒有ToJson功能?答案,沒有!
替換方案可有?答案,有! 可以MDataRow.ToTable().ToJson(),即轉成表格再輸出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內才是資料行。
如果每次把這樣的資料寫完文字,到時候讀取解析還原成表格,肯定有問題。
3:如何解決衝突:擴充套件功能,為單獨的資料行新增ToJson()功能
只單獨輸出:
{"ID":"2","ParentID":"-1","UserID":"2","NickName":"dddd"
,"Body":"aaddd","CreatedOn":"2011-4-24 0:22:21"}
這樣子,重複的往後寫,感覺就省了點位元組,而且也清爽秀多。
4:擴充套件再擴充套件:MDataTable.LoadFromJson要支援上
不過這麼重複的寫單行Json資料,再讀取,MDataTable是解析不了的,咋整?
解析不了就擴充套件一下,把它解析了,由於CYQ.Data的Json,都是本人手動寫的解析。
所以,修改來解析這樣一行一行的資料,還是可以處理的。三改兩改就支援上了,一切很好。
現狀就是可以往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又可以從這種格式還原成記憶體表了。
技術手段到了這裡,光明燦爛了。
一切流程很好:
1:客戶端提交資料-》
2:Ashx提交資料-》寫入記憶體表,然後把資料行ToJson寫入文字。
3:記憶體表在記憶體,總有失效的時候,失效時LoadFromJson又還原成表格,又繼續。
5:另一個重大的技術問題
一切看似很好,可是後面還是會有些問題呢的,什麼問題?往下看:
看一下表格的原始屬性:
內在表定義: private static MDataTable _Table = null;//記憶體資料表
表格的基本列:
_Table.Columns.Add("ID", SqlDbType.Int);//ID標識
_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);//內容
_Table.Columns.Add("CreatedOn", SqlDbType.DateTime);//建立日期
_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);//內容
_Table.Columns.Add("CreatedOn", SqlDbType.DateTime);//建立日期
問題:
在開始定義前,都是有不同的型別的,但如果內在表失效時,重新還原又是什麼狀況?
由於Json全是字串,在還原為記憶體表MDataTable時,預設全都置為SqlDbType.NVarChar,
於是表格的欄位型別全變字串了,如果只是還原後用於繫結顯示就沒啥問題了,如果此表格還需要進行一些複雜判斷比較,就比較糾結了。
正如我要查詢ID>數字的行,全是字串就真的很糾結。
如何解決?
想法一:有想法不是辦法:
開始糾結還原後的資料型別問題,通過判斷第一行Json的文字值,來定義設定欄位型別,比如:
檢測值是數字型:就Int。
檢測值是日期型:就DateTime
最後就預設給:NVarChar
為何不是辦法?
看似挺好,如果文字欄位內容第一行是數字,其它行又是字串呢?後面的內容不就糾結了?
想法二:有想法也是辦法:
既然首行取值判斷不行,如果首行存表架構呢?
首行Json欄位架構如下:
{"ID":"System.Int32","ParentID":"System.Int32","UserID":"System.Int32","NickName":"System.String","Body":"System.String","CreatedOn":"System.DateTime"}
於是,解析時,就可以準確的還原了,那如何輸出這行架構行?
於是,MDataColumn也多了個ToJson功能,用於輸出表架構,至此,Json的互動方面,也大功告成了!
三:總結
解決了這兩個重大的技術難題,接下來的,還有沒有其它技術問題?
有,查詢功能,即將擴充套件的MDataTable.Select(......)功能。
還有沒有?
大的沒了,還有就是技術細節問題了,如:接收引數,定義文字路徑,定義最大行ID等。
下節解說,敬請期待。
關注點:MDataTable在“愛說說”擴充套件了這麼多強勁的功能,啥時候釋出?
很快,可能是五一前後:會在 CYQ.Data V4.5正式版中整合,也敬請期待與關注。
本文轉自cyq1162 51CTO部落格,原文連結:http://blog.51cto.com/cyq1162/595592
,如需轉載請自行聯絡原作者
相關文章
- 對話式互動技術原理及流程揭祕
- 擴充套件說明: 指令微調 Llama 2套件
- shell擴充套件——免互動指令碼套件指令碼
- Json擴充套件方法JSON套件
- python算術運算子的擴充套件功能Python套件
- 擴充套件系統功能——裝飾模式(二)套件模式
- 擴充套件你的KUBECTL功能套件
- 位元組跳動遊戲版圖再擴充套件 入股仙境傳說CP遊戲套件
- 技術分享| 快對講影片排程功能說明
- Lynx技術分析-JS引擎擴充套件技術基礎JS套件
- 第3章 LALR等技術擴充套件套件
- SPI擴充套件點在業務中的使用及原理分析套件
- MySQL資料庫對GROUP BY子句的功能擴充套件(2)MySql資料庫套件
- MySQL資料庫對GROUP BY子句的功能擴充套件(1)MySql資料庫套件
- 說說android端實現Airplay多屏互動(二)AndroidAI
- 說說技術書籍
- 5.4 多鏈:區塊鏈應用的擴充套件互動區塊鏈套件
- 表空間自動擴充套件 AUTOALLOCATE 的擴充套件規律套件
- Lynx技術分析-JS引擎擴充套件設計JS套件
- 負載均衡的原理(垂直擴充套件 Scale Up、橫向擴充套件 Scale Out)負載套件
- PHP原始碼系列之擴充套件的原理與開發PHP原始碼套件
- 等保測評--移動互聯安全擴充套件要求套件
- Java 動態代理機制分析及擴充套件Java套件
- Mybatis外掛擴充套件以及與Spring整合原理MyBatis套件Spring
- 對WebUI技術感興趣的說 (轉)WebUI
- Lambda擴充套件與用途套件
- BSGS與擴充套件BSGS套件
- PHP擴充套件資料庫連線引數說明詳解PHP套件資料庫
- Java管理擴充套件指南之JMX技術總覽Java套件
- 技術筆記(10)Unity編輯器擴充套件筆記Unity套件
- Solon詳解(六)- Solon的校驗擴充套件框架使用與擴充套件套件框架
- PHPWAMP安裝Redis擴充套件的方式與相關擴充套件的下載PHPRedis套件
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- 對 Oracle 備份與恢復 的補充說明Oracle
- Kotlin擴充套件函式與屬性原理解析Kotlin套件函式
- iOS 推送通知及推送擴充套件iOS套件
- JavaScript 原生物件及擴充套件JavaScript物件套件
- 安裝PHP及Memcache擴充套件PHP套件