之前在這篇【那些年 DBeXpress 所教我的事:DBXCommon 單元】文章中提到 DBXCommon 是 Dbexpress (以下簡稱 DBX) 最底層的單元,像是 TDBXCommand 和 TDBXReader 便是 TSQLQuery 等 DBX DataSet 所包裝的內容,同時也是 DataSnap 底層架構,所以掌握 TDBXReader 就可說是掌握 DataSnap 效能這件事一點都不為過。
2021/04/26
2021/04/19
Delphi 特規 JSON 和 JavaScript Object (2)
前情提要:Delphi 特規 JSON 和 JavaScript Object (1)
已知大匠可以將 Blob 型態轉為 Hex JSON Array,但容量會放大 4 倍是硬傷;而 Memo 型態卻也被視為 Blob 型態,導致傳輸內容更加地龐大,更有堪者,可達放大 6 倍之譜。
追綜原因
Delphi 轉換 JSON 封包主要是利用 TDBXJSONTools.TableToJSON 函式庫內容,它會利用 TDBXReader.ValueType 進行 Delphi Value to JSON Value 轉換:
JsonCell := DBXToJSON(Value.Value[I], Value.ValueType[I].DataType, IsLocalConnection);
而 DBXToJSON 裡對 DataType 解析,節錄如下:
2021/04/16
Delphi 特規 JSON 和 JavaScript Object (1)
Delphi 開發這麼久,一直對 TFDMemTable 等 TDataSet 轉成 JSON 內容很有意見,在預設條件下,產出的是【特規】JSON 格式,如下圖所示:
為了方便說明,底下【特規 JSON 】一律使用【DJSON 】代換。
一般 JavaScript 前端大部份的物件所接受的 JSON 格式會是:
[{"EmpNo":2,"LastName":Nelson"}, {"EmpNo":4,"LastName":Eden"}]
Delphi 預設的格式不適用在前端,而 10.2 版開始有提供轉換函式來產出前端常用的 JSON 格式。
特規有特規的好處
當時為了達到這功能的我感到非常困惑,為什麼這功能要等這麼久才能實現?
後來想想,其實這特規確實有存在的必要。
因為,剛剛我們有看到前端常用的 JSON 格式會有【欄位名稱重複】的情形,像是上述的 EmpNo, LastName 每一筆都會出現一次,當筆數一多時,過多的重複資料會產生不必要的傳輸量,這時採用 DJSON 格式反而會是比較好的選擇。
前端的硬體效能都堪比伺服器,在前端轉換更能有效分配資源。