2011-02-02 30 views
3

我非常喜歡通過調用Java的RMI遠程方法的簡單,但它的序列化格式的詳細程度是一個主要的嗡嗡聲殺(是的,我已經爲基準,謝謝)。看起來,Sun的架構師在設計RPC(鬆散地說)組件時做了明顯的正確的事情,但是在實現序列化時拉大了史詩般的失敗。相反,看起來Thrift,Avro,Kryo(尤其是),協議緩衝區(不是那麼多)的架構師,等等。在設計他們的序列化格式時通常做了明顯的正確的事情,但要麼不提供RPC機制,提供一個是不必要的曲(或未成熟的),否則一個是朝比調用遠程方法的數據傳輸更爲適合(用於多種用途完全正常的,但不是我要找的)。我可以(輕鬆地)使用第三方庫來處理Java RMI的序列化嗎?

因此,顯而易見的問題是:我如何使用RMI的方法調用可愛,但是將以上庫中的一個用於wire協議?這可能沒有很多工作?我在評估上述庫過於嚴厲(NB我很討厭代碼生成,一般的一個;我不喜歡不必要的註解一些,和XML配置相當多的;任何形式的「豆」的讓我畏縮 - 我不需要重量;理想情況下,我正在爲我的遠程對象實現一個接口,就像RMI一樣)。

+0

我認爲你提到的許多libs(但不是Kryo)的主要挑戰是它們需要Schema的定義,這使得通用use-any-POJO RPC變得困難或不可能。 – StaxMan 2011-02-02 21:53:16

+0

快速序列化是一種兼容JDK序列的重新實現。但是,不確定是否有必要的鉤子來替換ObjectXXXputStream類。 https://github.com/RuedigerMoeller/fast-serialization – 2014-11-12 11:57:46

回答

2

曾幾何時,我也有同樣的要求。我改變了rmi方法的參數並將類型返回到byte []。

我用我的首選串行器對字節數組進行序列化的對象,然後調用我的修改後的rmi方法。

那麼,正如你所提到的java序列化過於冗長,因此5年前我沒有實現一個空間高效的序列化算法。它節省了太多的空間,如果你發送一個非常複雜的對象圖。最近,我有口這個序列化實施GWT,因爲在開發模式GWT序列化是慢得令人難以置信。

作爲一個例子;

RMI方法

public void saveEmployee(Employee emp){ 
    //business code 
} 

你應該改變它像下面,

public void saveEmployee(byte[] empByte) { 
     YourPreferredSerializer serialier = YourPreferredSerializerFactory.creteSerializer(); 
     Employee emp = (Employee) serializer.deSerialize(empByte); 
     //business code 
    } 

編輯:

您應該檢查MessagePack。它看起來有希望。

1

我不認爲有重新連線RMI的方法,但它可能是具體的替代項目 - 我特別想到DiRMI - 可能?和/或項目所有者可能會對此感興趣(Brian,其作者,來自Amazon.com,是一名非常稱職的軟件工程師)。

另一個有趣的項目是Protostuff - 它的作者也在構建RPC框架(我認爲);但即使沒有它也支持一系列令人印象深刻的數據格式;並且非常有效地完成這項工作(按照https://github.com/eishay/jvm-serializers/wiki/)。我個人認爲大多數項目所犯的最大錯誤(如PB,Avro)並沒有保持RPC與序列化方面的恰當分離,而是很好地區分開來。 因此,使用可插拔的數據格式或序列號商辦RPC能力似乎是一個好主意,我。

+1

+1「我個人認爲大多數項目所犯的最大錯誤(如PB,Avro)沒有將RPC與序列化方面的適當分離很好地分開」 - 停止閱讀我的心神! – user359996 2011-02-02 21:53:15

1

writeReplace()和readResolve()可能是這樣做的最佳組合。強大的右手。

1

Java序列化只是詳細描述了序列化的類和字段。總的來說,這種格式與XML一樣是「自我描述」的。你可以實際覆蓋這個並用其他東西替換它。這是writeClassDescriptor和readClassDescriptor方法的用處。 Dirmi覆蓋了這些方法,因此它能夠使用標準對象序列化,並且花費更少。

它的工作方式與會話的工作方式有關。兩個端點都可能有不同的對象版本,所以簡單地扔掉類描述符將不起作用。相反,額外的數據交換(在後臺),以便序列化的描述符被特定於會話的標識符替換。在看到標識符後,檢查查找表以找到描述符對象。由於數據是在後臺交換的,因此會話創建後以及每次首次寫入對象類型時都會有一個簡短的「預熱期」。

Dirmi目前無法取代線格式。

相關問題