愛說說技術原理:與TXT交互及MDataTable對Json的功能擴展(二)

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

關于愛說說在技術選型的文章見:"愛說說"技術原理方案的定選思考過程

?

本篇將講述“愛說說”比較重大的技術問題點及解決手段:

?

愛說說:http://speak.cyqdata.com/

?

雜說幾句:

一開始,原本是打算在秋式開源團隊找一JS人才來引導前臺頁面的呈現的,畢竟本人在JS還停留在原始的編碼階段,于是當時聊了一下。

再后來,接下來幾天,由于秋式開源團隊內部管理上有點小調整,還有新開任務小組的事,連續忙了幾天,“愛說說”就也停了幾天。

幾天過后,回到群里Call人,發現原來JS的人才一去無蹤影了,沒法只好自己動手了。

?

在定好技術方案后,下面開始技術的分析:

?

“愛說說”的邏輯:

前端html-》發送ajax請求-》后端ashx處理并返回Json-》前端接收Json并解析顯示

?

從后端Ashx說起:

?

一:TXT文本交互的技術解析

?

1:數據寫入:每次往文本的最后面寫一條Json數據,語句很簡單:

??????? public void AppendText(string appendText)
??????? {
??????????? File.AppendAllText(FilePath, appendText);
??????? }

利用System.IO.File類即可輕松處理。

?

2:數據讀取:內存表緩存失效時,需要重新加載TXT文本的Json數據,語句也很簡單:

??????? public string LoadText()
??????? {
??????????? return File.ReadAllText(FilePath);
??????? }

還是一行代碼,處理簡單。

?

3:刪除功能:需要移除TXT文本內的某行Json數據,也很容易的說:

??????? public void RemoveText(string removeText)
??????? {
??????????? 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);//創建日期

?

問題:

在開始定義前,都是有不同的類型的,但如果內在表失效時,重新還原又是什么狀況?

由于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正式版中集成,也敬請期待與關注。

轉載于:https://my.oschina.net/secyaher/blog/274034

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536383.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536383.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536383.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ActiveXObject 安裝

將后綴名為ocx的文件拷貝至目錄 c:\Windows\SysWOW64\。執行如下命令,進行注冊:regsvr32 c:\Windows\SysWOW64\x.ocx轉載于:https://www.cnblogs.com/Currention/p/11024354.html

如何制作VSPackage的安裝程序

2019獨角獸企業重金招聘Python工程師標準>>> 第一步,生成一個REG文件: 收錢進入目錄: C:\Program Files\Microsoft Visual Studio 2008 SDK\VisualStudioIntegration\Tools\Bin 這是SDK的目錄,使用regpkg.exe 命令 命令格式為: …

MyBatis學習總結(1)——MyBatis快速入門

2019獨角獸企業重金招聘Python工程師標準>>> 一、Mybatis介紹 MyBatis是一個支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數的手工設置以及對結果集的檢索封裝。MyBatis可以使用簡單的XML或注解用于配置和…

MyEclipse+Tomcat+MAVEN+SVN項目完整環境搭建

2019獨角獸企業重金招聘Python工程師標準>>> 這次換了臺電腦,所以需要重新配置一次項目開發環境,過程中的種種,記錄下來,便于以后再次安裝,同時給大家一個參考。 1.JDK的安裝 首先下載JDK,這個從…

Java基礎學習總結(10)——static關鍵字

2019獨角獸企業重金招聘Python工程師標準>>> 一、static關鍵字 原來一個類里面的成員變量,每new一個對象,這個對象就有一份自己的成員變量,因為這些成員變量都不是靜態成員變量。對于static成員變量來說,這個成員變量只…

ActiveMQ學習總結(3)——spring整合ActiveMQ

2019獨角獸企業重金招聘Python工程師標準>>> 1.參考文獻 Spring集成ActiveMQ配置Spring JMS異步發收消息 ActiveMQ2.環境 在前面的一篇 ActiveMQ入門實例中我們實現了消息的異步傳送,這篇博文將如何在spring環境下集成ActiveMQ。如果要在spring下集成Act…

Pots【廣搜,模擬】

Pots POJ - 3414 You are given two pots, having the volume of A and B liters respectively. The following operations can be performed: FILL(i) fill the pot i (1 ≤ i ≤ 2) from the tap;DROP(i) empty the pot i to the drain;POUR(i,j) pour fro…

非常可樂【廣搜,模擬】

非常可樂 HDU - 1495 大家一定覺的運動以后喝可樂是一件很愜意的事情,但是seeyou卻不這么認為。因為每次當seeyou買了可樂以后,阿牛就要求和seeyou一起分享這一瓶可樂,而且一定要喝的和seeyou一樣多。但seeyou的手中只有兩個杯子&#xff0…

問題 A: 深度學習

問題 A: 深度學習 時間限制: 1 Sec 內存限制: 128 MB 提交: 53 解決: 42 [提交] [狀態] [討論版] [命題人:admin] 題目描述 小 A 最近在研究深度學習,他自己搭建了一個很牛逼的神經網絡,現在他手頭一共有 n 組訓練數據,一開始他會給自己的…

堆樹

一、堆樹的定義 堆樹的定義如下: (1)堆樹是一顆完全二叉樹; (2)堆樹中某個節點的值總是不大于或不小于其孩子節點的值; (3)堆樹中每個節點的子樹都是堆樹。 當父節點的鍵…

問題 D: 最小生成樹II

問題 D: 最小生成樹II 時間限制: 1 Sec 內存限制: 128 MB 提交: 89 解決: 44 [提交] [狀態] [討論版] [命題人:admin] 題目描述 小A有一張n個點的帶權無向圖,這張無向圖非常特別,首先第i個點有一個點權ai,之后這張無向圖是一張完全圖&…

問題 G: 區間權值

問題 G: 區間權值 時間限制: 1 Sec 內存限制: 128 MB 提交: 112 解決: 49 [提交] [狀態] [討論版] [命題人:admin] 題目描述 小Bo有n個正整數a1..an,以及一個權值序列w1…wn,現在他定義 現在他想知道的值,需要你來幫幫他 你只需要輸出答案…

問題 I: 連通塊計數

問題 I: 連通塊計數 時間限制: 1 Sec 內存限制: 128 MB 提交: 108 解決: 45 [提交] [狀態] [討論版] [命題人:admin] 題目描述 小A有一棵長的很奇怪的樹,他由n條鏈和1個點作為根構成,第i條鏈有ai個點,每一條鏈的一端都與根結點相連。 現在…

telnet 功能啟用并測試端口是否正常

記錄日期:2019年6月21日 13點52分 操作系統:Windows 10 由于 Ping命令可以檢查網絡是否連通,但無法準確判斷某個端口是否連通,因此需要使用 Telnet協議。 1、打開控制面板中的程序和功能。 2、側邊欄,啟用或關閉Window…

步步為營 SharePoint 開發學習筆記系列 七、SharePoint Timer Job 開發

概要 項目需求要求我們每天晚上同步員工的一些信息到sharepoint 的user List ,我們決定定制開發sharepoint timer Job,Sharepoint timer Job是sharePoint的定時作業Job,需要安裝、布曙到服務器上,而這里我只是介紹下Job開發的例子,以供大家學習用。 開發…

問題 J: 尋找復讀機【模擬】

問題 J: 尋找復讀機 時間限制: 1 Sec 內存限制: 128 MB 提交: 131 解決: 50 [提交] [狀態] [討論版] [命題人:admin] 題目描述 某個QQ群里一共有n個人,他們的編號是1..n,其中有一些人本質上是復讀機。 小A發現,如果一個人的本質是復讀機&…

windows下jenkins常見問題填坑

沒有什么高深的東西,1 2天的時間大多數人都能自己摸索出來,這里將自己遇到過的問題分享出來避免其他同學再一次挖坑. 目錄 1. 主從節點 2. Nuget自動包還原 3. powershell部署 4. 內網機器實現基于變化的構建 5. Github私有項目pull時限 所謂主從&#x…

Cow Contest【最短路-floyd】

Cow Contest POJ - 3660 N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming contest. As we all know, some cows code better than others. Each cow has a certain constant skill rating that is unique among the competitors. …

【學習Android NDK開發】Type Signatures(類型簽名)

類型簽名&#xff08;Type Signatures&#xff09; (<Parameter 1 Type Code>[<Parameter 1 Class>];...)<Return Type Code> The JNI uses the Java VM’s representation of type signatures. Following Table shows these type signatures. Type Signatur…

Symantec(賽門鐵克)非受管檢測

為了查找局域網內沒有安裝賽門鐵克客戶端的IP&#xff0c;采用Symantec Endpoint Protect Manager 的非受管檢測機制進行網段掃描。 非受管檢測機制的原理是&#xff1a;每臺電腦開機時都會向同網段電腦發arp&#xff0c;當非受管檢測器接到arp請求時&#xff0c;會寫入本地的a…