什麼是JSON,我想我不必多說,因為Internet上一堆有關JSON的說明各位可以自行搜尋,簡單的說JSON是一種資料傳遞的格式,流行於JavaScript和Ajax的世界。OK,那麼JSON和DataSnap又有什麼關係? 當DataSnap應用於分散式架構時不是使用COM/COM+嗎?Tiburon的DataSnap為什麼要使用JSON呢?
其實這些問題在我第一次知道DataSnap使用JSON時也立刻出現在我腦中,不過一經思索很多問題的答案就立刻浮現了出來而且也立刻延伸出了許多其他的想法,知道為什麼嗎? 因為在我觀察任何技術時我還是喜歡馬上看看站在這個技術後面的人的背景以及這個技術代表的趨勢,現在讓我還原一下當初我腦中思考的過程。
還記得Steve嗎?它現在是Delphi/C++Builder在資料存取技術方面的架構師,我以前也寫過有關Steve的文章,其中敘述了Steve是來自Java的背景,因此在VCL架框中屬於Steve小團隊開發的程式碼中我都可以感覺到些許Java的味道,特別是在一些架構方面更是清楚的透露了Steve的背景。既然我們瞭解了Steve的背景,那麼當Steve在面臨負責DataSnap的研發方向時你覺得Steve會怎麼做?
因此讓我們試著分解前面的數個問題,:
問題 | 種類 | 答案&方向 |
當DataSnap應用於分散式架構時不是使用COM/COM+嗎 | 這是屬於分散式架構訊息傳遞層的問題。OK,想想看,當COM/COM+不再是主流時,DataSnap如果仍然使用COM/COM+那麼將會愈來愈封閉。 | 找出一種跨平台和主流的分散式通訊協定和訊息傳遞格式,TCP + JSON肯定是最好的選擇之一。 |
DataSnap為什麼要使用JSON呢 | 這是屬於策略的問題,DataSnap使用了JSON之後可以開啟什麼樣的機會之門? 簡單,Delphi/BCB可以立刻和所有使用JSON技術的軟體整合在一起。 | DataSnap使用JSON做為分散式架構訊息的格式後,不但可以脫離COM/COM+的限制,又可以結合跨平台(Win64也可以使用),也可以和Java,Ajax,.NET整合,讓Delphi可以立刻融入Web上主流訊息格式的世界。 |
JSON和DataSnap又有什麼關係 | 這是屬於實作的問題,Delphi/BCB在提供分散式架構時可以使用JSON做為訊息封裝的格式嗎? | 當然可以,JSON雖然來自Java/JavaScript的世界,但也只是一種訊息封裝的格式而已,JSON簡單又快速,實作也不難。 |
所以現在很清楚了,Delphi/BCB的DataSnap採用TCP + JSON之後不但提供了更具彈性的分散式架構,而且由於JSON的簡潔,因此在傳遞速度上將會非常的理想,
使用JSON另外一個好處是JSON也定義了傳遞物件的格式,這非常的有趣,因為DataSnap中的DataSet,Delta等都是物件,那麼不是都可以使用JSON來傳遞嗎? 再者遠端物件的方法也可以當成物件來看待,那麼再進一步也許再藉由Delphi/BCB原有的RTTI那麼是不是可以做到像Java的RMI(Remote Method Invocation)呢,我想當時Steve心中一定是這樣想的。如果能夠這樣做到的話,那麼代表Delphi/BCB的用戶端就可以像Java一樣在用戶端呼叫遠端的伺服器服務,再藉由DataSnap原本豐富的DataSet/Delta等處理資料的功能,那麼這將比Java的RMI強太多了。
這樣的思路的確發人省思,因為如此一來不但發展出了DataSnap新的分散式架構,允許Delphi/BCB用戶端不必使用COM/COM+就可以呼叫遠端服務,而且使用JSON之後Delphi/BCB可以立刻整合於Java,Ajax和.NET。
不過要這樣做仍然需要克服2個最大的技術問題,那就是:
1 原本的DataSnap分散式架構使用COM/COM+,用戶端的TClientDataSet等元件是藉由IAppServer介面和遠端的Remote資料模組溝通,因此如果新的DataSnap使用TCP + JSON,那麼舊的DataSnap應用程式怎麼辦?
2. Delphi/BCB原本的RTTI提供的資訊不夠豐富,而Delphi/BCB又沒有像Java/.NET那樣的Reflection API,因此用戶端無法擷取足夠的遠端方法的MetaData進而組合正確方法原型以呼叫遠端的服務方法。
第一個問題不難解決,舊的DataSnap仍然會存在於Tiburon之中(也就是說仍然可以使用COM/COM+),問題只是在如何通透的讓舊的DataSnap架構能夠使用JSON,其實這個關鍵只是IAppServer介面,因此我們只需要使用Adapter設計樣例就可以簡單的解決,那就是讓DataSnap用戶端連結到新的元件,這個元件同樣實作了IAppServer介面,這可以讓DataSnap用戶端以為仍然是連結到以前的Remote資料模組,但事實上已經是連結到使用TCP + JSON新架構的元件了(就是稍後我們會討論的TDSServer和TDSServerClass元件)。
第二個問題則需要新的編譯器技術,在原本的RTTI中產生足夠的Metadata可以讓DataSnap用戶端呼叫遠端方法,這就是Tiburon新的編譯器指令{$MethodInfo ON}和{$MethodInfo OFF}的目的。
OK,瞭解這些基本的思路和想法之後,下次就讓我們看看如何在Tiburon中使用TCP + JSON建立一個新的分散式應用程式,同時我們也會觸及到JSON是出現在這個新的分散式架構的那個地方,Have Fun!