mORMot沒有控件安裝,直接添加到lib路徑,
工程中直接添加syncommons,syndb等到uses里
---------------------------------------------------------
在進行網絡編程中需要JSON對象的構建與解析,
這個Delphi?XE+自帶:
{$IF?CompilerVersion>22},?System.JSon{$ELSE},?DBXJSON{$IFEND}
不過,不好用,大家更喜歡SuperObject。我本人以前一直用JsonDataObjects。
今天要給大家介紹的這套JSON代碼庫算是“世外高人”,身懷絕世武功,而默默無聞,這就是?mORMot?系列開發框架。這是一個功能超級強大,學習曲線壁陡的開源框架。
http://synopse.info/
Project?Name:??Synopse?mORMot?Framework
Document?Name:??Software?Architecture?Design
Document?Revision:??1.18
Date:??May?27,?2016
Project?Manager:??Arnaud?Bouchez
這是PDF文檔下載地址:
http://synopse.info/files/pdf/Synopse%20mORMot%20Framework%20SAD%201.18.pdf
信息量達到驚人的2127頁。大部分人被這份文檔嚇到,以至于錯過了修煉這套“絕世武功”的機會。
今天咱們從中把JSON編程單揀出來,看看mORMot有什么神奇的地方。
使用mORMot沒有想象的那樣難,使用JSon只需要引用一個文件synCommons。下面我們來看代碼,將SuperObject與mORMot做一個對比:
const?cstMaxTest?=?100000;
procedure?TForm1.TestSO;
var?jo:?ISuperObject;?i:?Int64;?sw:?TStopWatch;
begin
??sw?:=?TStopWatch.Create;
??jo?:=?SO();
??i?:=?0;
??while?i?<?cstMaxTest?do?begin
????jo.S['Name']?:=?'This?is?a?Str'?+?IntToStr(i);
????jo.I['Age']?:=?i;
????jo.O['List']?:=?SO('[1,"Hello",5,{"name":"c5soft","age":50}]');
????if?i?=?100?then
??????Log('SO:'?+?jo.AsJSon());
????inc(i);
??end;
??Log('SuperObject:?'?+?sw.Stop());
??sw.free;
end;
procedure?TForm1.TestMJ;
var?jo:?Variant;?i:?Int64;?sw:?TStopWatch;
begin
??TDocVariant.New(jo);?;
??sw?:=?TStopWatch.Create;
??i?:=?0;
??while?i?<?cstMaxTest?do?begin
????jo.Name?:=?'This?is?a?Str'?+?IntToStr(i);
????jo.Age?:=?i;
????jo.List:=_JSon('[1,"Hello",5,{"name":"c5soft","age":50}]');
????if?i?=?100?then
??????Log('MJ:'?+?VariantSaveJSON(jo));
????inc(i);
??end;
??Log('mORMot?JS:?'?+?sw.Stop());
??sw.free;
end;
做一個10萬次的測試,這是輸出結果:
SO:{"Age":100,"Name":"This?is?a?Str100","List":[1,"Hello",5,{"age":50,"name":"c5soft"}]}
SuperObject:?00:01.561
MJ:{"Name":"This?is?a?Str100","Age":100,"List":[1,"Hello",5,{"name":"c5soft","age":50}]}
mORMot?JS:?00:00.326
發現了吧,mORMot比SuperObject快太多,干同樣的活,SuperObject用的時間是mORMot的5倍。
使用mORMot還用另外兩個好處:
其一、用jo.Name代替jo.S['Name']更直觀
其二、在調試階段設置斷點,觀察jo的值,delphi告訴你:{"Name":"This?is?a?Str100","Age":100,"List":[1,"Hello",5,{"name":"c5soft","age":50}
而你去跟蹤SuperObject的jo,Delphi只能告訴你那是一個對象,具體值是多少,她說“太復雜,一言能盡”,結果什么也看不到。
下期預告:windows下構建http服務,放棄indy(intraweb),改用iocp(diocp)嗎?錯了!用http.sys才是王道,這一切mORMot已經悄悄地為我們準備好了。
http://bbs.2ccc.com/topic.asp?topicid=511839
---------------------------------------------------------
我測試了,我一個表內一次提取12萬多條數據,服務器端生成json串時間不到3秒,程序和數據庫都在我機器上,不知道測試的準確不
---------------------------------------------------------
mORMot內部集成的數據庫是SQLite,mORMot可以連接任何當前流行的數據庫,mORMot還可以不連接任何數據庫,用內存表來工作。
說到SQLite,這也是很牛X的,很獨特的。這是一種動態數據類型的數據庫,create?table時可以不指定字段類型,指定了數據類型比如整數型,也可以保存字符串類型的數據。這是目前開源、跨平臺、代碼量最小的數據庫。如果數據量不大,希望集成在可執行文件中?(embbed),sqlite是一個很好的選擇。
如果要輸出很大的數據到終端界面,一定要使用分頁。即使Delphi生成json數據
不慢,網絡傳送速度快不了,前端(比如瀏覽器)裝配數據快不了。SQLite的select?支持分頁:
??SELECT?...?FROM?...?WHERE?...?ORDER?BY?..?LIMIT...?OFFSET...
沒有mORMot,可以用DISQLite,僅能做單機版的軟件,有了mORMot,使用SQLite數據庫可以做C/S架構的軟件,而且很方便的就有了3Tier,?4Tier。