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(无数评论)的更多相关文章

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

    mORMot没有控件安装,直接添加到lib路径,工程中直接添加syncommons,syndb等到uses里 --------------------------------------------- ...

  2. [Python ]小波变化库——Pywalvets 学习笔记

    [Python ]小波变化库——Pywalvets 学习笔记 2017年03月20日 14:04:35 SNII_629 阅读数:24776 标签: python库pywavelets小波变换 更多 ...

  3. Go语言核心36讲(导读)--学习笔记

    目录 开篇词 | 跟着学,你也能成为Go语言高手 导读 | 写给0基础入门的Go语言学习者 导读 | 学习专栏的正确姿势 开篇词 | 跟着学,你也能成为Go语言高手 Go 语言是由 Google 出品 ...

  4. mORMot学习笔记3 数据集转Json

    usesSynCommons, SynDB, SynOleDB; procedure TForm1.DataToJsonClick(Sender: TObject); var Conn: TOleDB ...

  5. Go语言核心36讲(Go语言实战与应用十二)--学习笔记

    34 | 并发安全字典sync.Map (上) 我们今天再来讲一个并发安全的高级数据结构:sync.Map.众所周知,Go 语言自带的字典类型map并不是并发安全的. 前导知识:并发安全字典诞生史 换 ...

  6. Go语言核心36讲(Go语言实战与应用十四)--学习笔记

    36 | unicode与字符编码 在开始今天的内容之前,我先来做一个简单的总结. Go 语言经典知识总结 在数据类型方面有: 基于底层数组的切片: 用来传递数据的通道: 作为一等类型的函数: 可实现 ...

  7. Go语言核心36讲(Go语言实战与应用十五)--学习笔记

    37 | strings包与字符串操作 Go 语言不但拥有可以独立代表 Unicode 字符的类型rune,而且还有可以对字符串值进行 Unicode 字符拆分的for语句. 除此之外,标准库中的un ...

  8. Go语言核心36讲(Go语言实战与应用十八)--学习笔记

    40 | io包中的接口和工具 (上) 我们在前几篇文章中,主要讨论了strings.Builder.strings.Reader和bytes.Buffer这三个数据类型. 知识回顾 还记得吗?当时我 ...

  9. Android Native 代码NDK开发学习笔记

    引用:http://www.kunli.info/2011/08/21/android-native-code-study-note/ JNI,全称Java Native Interface,是用于让 ...

随机推荐

  1. bzoj 4401 块的计数 思想+模拟+贪心

    块的计数 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 455  Solved: 261[Submit][Status][Discuss] Descr ...

  2. 转:WOM 编码与一次写入型存储器的重复使用

    转自:WOM 编码与一次写入型存储器的重复使用 (很有趣的算法设计)——来自 Matrix67: The Aha Moments 大神 计算机历史上,很多存储器的写入操作都是一次性的. Wikiped ...

  3. Jerasure库接口简介及性能测试

    http://blog.chinaunix.net/uid-20196318-id-3277600.html Jerasure库提供Reed-Solomon和Cauchy Reed-Solomon两种 ...

  4. 洛谷P2625 豪华游轮

    题目描述 有一条豪华游轮(其实就是条小木船),这种船可以执行4种指令: right X : 其中X是一个1到719的整数,这个命令使得船顺时针转动X度. left X : 其中X是一个1到719的整数 ...

  5. 解决PHP无法接收post超过1000个字段的问题

    今天在做与后台交互的的过程中,发现php对于接收的POST有一个限制,超出1000个字段之后便无法接收,项目要求在不改变PHP配置的情况下通过前端方式解决,通过分析并且网上差一些大牛的资料终于找到了解 ...

  6. scp、paramiko、rsync上传下载限流、限速、速度控制方法

    1.scp限速  scp -l 800 a.txt  user@ip:/home/admin/downloads 此时的传输速率就是800/8=100KB左右 man -a scp查看参数含义.注意单 ...

  7. iOS开发 下滑隐藏Tabbar

    项目中用到下滑隐藏tabbar,上滑显示.      虽然实现起来非常简单,还是记录一下. -(void)scrollViewDidScroll:(UIScrollView*)scrollView { ...

  8. go使用时间作为种子生成随机数

    原文:http://blog.csdn.net/qq_15437667/article/details/50851159 --------------------------------------- ...

  9. SQL存储过程实例详解

    本文用3个题目,从建立数据库到创建存储过程,详细讲解数据库的功能. 题目1         学校图书馆借书信息管理系统建立三个表:         学生信息表:student 字段名称 数据类型 说明 ...

  10. Bootstrap的表单控件

    支持的表单控件 Bootstrap 支持最常见的表单控件,主要是 input.textarea.checkbox.radio 和 select. 输入框(Input) 最常见的表单文本字段是输入框 i ...