• Delphi语言最好的JSON代码库 mORMot学习笔记1


    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。

  • 相关阅读:
    GATK-BWA-MEM handle GRCh38 alternate contig mappings
    GATK使用说明-GRCh38(Genome Reference Consortium)(二)
    GATK使用说明(一)
    [python] 线程池
    [python] 线程锁
    [python] 线程简介
    [linux] 更改目录显示颜色
    限制登录次数
    项目经验总结-twice
    Java泛型底层源码解析--ConcurrentHashMap(JDK1.6/JDK1.7/JDK1.8)
  • 原文地址:https://www.cnblogs.com/h2zZhou/p/7364947.html
Copyright © 2020-2023  润新知