1. 程式人生 > >Delphi語言最好的JSON代碼庫 mORMot學習筆記1

Delphi語言最好的JSON代碼庫 mORMot學習筆記1

數據庫 roc des nop 內部 文件 人的 我們 1.5

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。

Delphi語言最好的JSON代碼庫 mORMot學習筆記1