2010-11-12 22 views

回答

3

當前不是。序列化函數意味着將其字段存儲到對象輸出流中,並對其進行反序列化意味着從其他地方的對象輸入流中讀取函數對象。反序列化假設從對象輸入流中讀取的對象的類是JVM已知的。記住 - 功能只是場景背後的物體。

在這種情況下,服務器不知道正在序列化的函數對象的實際具體類,只是可能實現了接口。爲了支持這種功能,您必須找到相關功能的類文件,將其發送到服務器,然後使用自定義classloader將其加載到服務器上。然後,如果對象具有任何形式的狀態,則可以在客戶端上序列化對象,通過網絡發送它並在服務器上反序列化它。只有這樣你才能運行它的方法。假設你的函數對象是無狀態的,通常情況下,你可以跳過序列化/反序列化步驟。

編輯:

還要記住,該功能可以在內部保持引用他們的調用環境。這意味着你可能最終序列化與它一起函數對象,這可能是你的整個程序數據的環境..

+0

但是,序列化只會將函數的字段值存儲到流中。 'apply'方法的重定義是特定於實現'Function'接口的匿名類的。如果我的理解正確,重新定義的匿名類的apply方法中的實際代碼不會被序列化。對?在這種情況下,服務器上的遠程角色將如何知道僅在客戶端已知的'apply'方法的主體? – axel22 2010-11-12 09:10:18

+1

同意,已在此主題上找到一個主題:http://scala-programming-language.1934581.n4.nabble.com/Passing-functions-to-remote-actor-td2991157.html – 2010-11-12 10:29:01

4

下面是使用的URLClassLoader與遠程參與者的example獲取類通過客戶端的http並在服務器上執行通用計算。

您可能也有興趣HotSwap technique適用於序列化Akka Actors

相關問題