2010-04-18 64 views
2

在兩臺不同的機器/網絡/互聯網上的程序之間的通信過程中,序列化,編組等需要什麼時候?用不同語言編寫的2個程序之間的通信 - 序列化?

假設我有在Java /閃存客戶端程序,並用自己的自定義協議下的服務器程序不能執行我溝通?我猜是這樣。什麼時候需要序列化?我知道Java RMI,CORBA等有這些機制。但爲什麼?這是必須的嗎?請賜教?

回答

1

我不能使用我自己的自定義協議來實現通信使用 嗎?我想 所以。

可以。你可能不應該重新發明輪子。序列化非常棘手。使用經過良好測試的標準解決方案以獲得更好的結果與編寫數據傳遞例程相比,您將花費更少的時間學習API。

當系列化等需要?

對於初學者來說,需要將一些內存結構從一個進程轉移到另一個進程。

這裏有描述多個用例:http://en.wikipedia.org/wiki/Serialization

我知道的Java RMI,CORBA等有這些機制。但爲什麼?這是必須的嗎?請賜教?

沒有一個「是必須的」,就像你說的那樣,你可以編寫自己的協議。 (海事組織)倚重這方面的一些現有技術,比如XML或其他您提到的其他技術。你使用哪種技術真的取決於你想要做什麼,所以我不打算推​​測:)

傳遞序列化數據的一個很好的機制是Google's protocol buffers.他們負責編碼(在更多比XML更高效的方式)和端到端翻譯。

+0

你的回答有點不錯,但沒有提供足夠的推理或清晰度。如果可能,請以簡單而明確和具體的方式解釋。謝謝! – user319280 2010-04-18 03:32:12

+0

@ trojanwarrior3000:我的答案的哪些部分不清楚? FWIW,我提供了具體的推理 - 推出自己的協議比較慢,需要序列化來在進程之間傳遞數據。 – Stephen 2010-04-18 03:36:48

+0

我是這麼認爲的 - 我認爲序列化在使用任意數據類型(如對象)進行遠程調用時非常有用 - 那麼這些工具就比創建自己的協議更容易。謝謝! – user319280 2010-04-18 04:31:35

0

本,這些天,最好的辦法是將XML消息發送來回。

2

程序中的對象有一個定義良好的內存佈局,由您的編譯器施加。但是在另一臺機器上運行的另一個程序中,這種佈局不會完全相同,而是由另一臺編譯器編譯。它通常不與傳輸介質非常兼容,例如網絡連接或文件。您需要注意將物體從一臺機器轉移到另一臺機器。

文件和網絡數據包是簡單的字節流。這就是序列化起作用的地方,您需要將內存中的對象序列化爲字節流。它需要在接收端反序列化,從字節流回到對象中。

這樣做的顯而易見的方法是二進制序列化。您爲對象中的每個字段獲取字節並將其寫入流中。非常高效,但也很麻煩。你遇到的第一個問題是接收端對於對象的外觀有不同的想法。它可以用不同版本的對象聲明進行編譯,例如有一個附加字段。當對象在不同的​​機器之間交換時,問題更加嚴峻。他們可能對整數中的字節數有非常不同的想法。或者字節順序(endian-ness)。

已經有很多解決這個問題。它們通常涉及某種描述對象中字段的元數據。 Unicode的出現使得可以將元數據和字段值放入文本描述中,XML就是最好的例子。

+0

如果使用字節流協議並處理雙方的字節順序,那足夠了嗎? – user319280 2010-04-18 07:54:43

+0

希望對這個問題有好處的人會對我的評論投下更多的信息! – user319280 2010-04-18 10:05:20

+0

如果不知道數據的結構,則無法處理字節序。每個領域都必須單獨倒置。 – 2010-04-18 10:33:04

相關問題