2014-04-06 29 views
1

問:Java序列,以任何語言之間傳輸數據

而不是寫我自己的序列化算法;是否有可能只使用內置的Java序列化,就像我在下面所做的那樣,同時仍然可以跨多種語言使用它?


說明:

我如何想象它的工作,將是如下:我啓動了一個進程,那將是是一個特定語言的程序 - 該語言編寫的。所以我會有一個CppExecutor.exe文件,例如。我會寫數據到這個程序的一個流。該程序然後將做它需要做的事情,然後返回結果。

爲此,我需要以某種方式序列化數據。首先想到的是使用ObjectInputStreamObjectOutputStream的基本Java Serialization。我讀過的大部分內容只是說Java序列化是Java到Java的應用程序。

這些數據都不需要存儲在文件中。傳輸這些數據包的方法是通過我已經建立的java.lang.Process

的數據將被組成如下:

  • String - 大部分包含被顯示給用戶的信息。
  • Integer - 最有可能的是32位。不需要處理時間。
  • Float - 只是爲了處理所有的浮點值。
  • Character - 確保使用正確的類型。
  • Array - 由此列表中的任何元素組成。

我已經制定了如何做到這一點的最佳方式如下:我將從一個4字節的幻數開始 - 只是爲了確保我們正在使用正確的數據。以下,我會有一個整數,指定有多少元素。之後,對於每個元素,我將擁有:單個字節,表示數據類型(以上),後面是關鍵信息e.x:lengthStringArray)。然後,數據如下。


側面說明:

我也想指出的是,很多這些計算將採取地方,在那裏每毫秒可能無所謂。因此,基於文本的格式(如JSON)可能會產生更大的操作時間。考慮到非數據包需要由人解釋,只使用字節不會是一個問題。

+0

你看過這個http://stackoverflow.com/questions/1714624/is-there-any-library-to-deserialize-with-python-這-is-serialized-with-java –

+0

恕我直言,你可以在這裏做的最糟糕的事情是重新發明輪子。這是一個以前已經被別人徹底探究過的案例,並且像Google的Protobuf一樣渺茫,創造出像測試一樣的戰鬥的可能性。 –

回答

7

我推薦Google protobuf:它是二進制的,穩定的,被證實的,並且對你提到的所有語言都有綁定。而且,它也很好地處理結構化數據。

+0

謝謝!我可能會使用它,然後當我需要擴展到Java,Python和C++之外時,我可以使用它作爲我的模型的基礎。 – Obicere

3

存在稱爲bson的二進制json格式。

我也想指出的是,很多這些計算都將發生,因此基於文本的格式(如JSON)產生大得多的運行時間。


您測量之前不要優化。不成熟的優化是一切罪惡的根源。

你可以嘗試一下基準吞吐量嗎?看看它是否符合你的需求?

+0

我看到它的方式,有一堆'浪費'沒有好處。我是唯一一個很有可能讀過數據包的人,我可以很好地解釋字節。我還在計劃中,除非我想重寫這個程序的一個非常大的組件,否則我想從堅實的基礎開始。 – Obicere

+0

所以你的問題就像是:「在進程之間發送大量數據有多糟糕?」 (我無法明確)進程間通信速度相當快。它甚至不必是複製操作。如果接收器未修改內存,則不需要複製內存。具有虛擬內存的操作系統可以做到這一點。 – User

+0

我有我無法回答的問題,因爲我不知道'堅實的基礎','堅實的基礎','重寫'什麼,'解釋字節好'的意思。那「我看到它的方式,有一堆'浪費'不會有好處。」是兩倍的意見,不可衡量。如果你能詳細討論這個問題並重新回答你的問題,你將有機會得到新的答案。例子也會很好。哪些字節在兩個使用usecase的進程之間發送?這使得更容易理解你的目標。 – User

1

節儉,的Protobuf,JSON,MessagePack

安裝節儉的複雜性>>的Protobuf> BSON> MessagePack> JSON

串行化數據大小JSON> MessagePack>二進制節儉>緊湊節儉>的Protobuf

時間成本緊湊Thrift>二進制Thrift> Protobuf> JSON> MessagePack