2010-11-14 72 views
5

下面是我讀過的東西,想知道這個陳述是否屬實。序列化是必須的,以便通過電線傳輸數據?

序列化是 轉換數據結構或對象 成比特序列的過程,以便它可以 被存儲在文件或存儲器緩衝器, 或通過網絡 連接鏈路傳送到是「復活「 後來在相同或另一臺計算機 環境。[1]當根據 重新讀取所得的 系列位的序列化格式時,它可以是 用於創建原語 的同義克隆對象。對於很多複雜的對象,如 與那些廣泛使用 引用的對象,此過程不是直接的 。

+9

位是幾乎唯一的選擇,除非你使用信鴿 – 2010-11-14 03:40:03

+0

確定所以這個說法是真的嗎? – user770022 2010-11-14 03:41:19

+0

@MitchWheat +1 for http://www.faqs.org/rfcs/rfc1149.html ...不要忘記旅行車的運輸能力;) – jcolebrand 2010-11-14 03:42:30

回答

6

序列化只是描述當你想要傳輸某個數據結構,類等時你做什麼的一種奇特方式。

例如,說我有一個結構:

struct Color 
{ 
    int R, G, B; 
}; 

當你將本在你不說發送彩色網絡。您創建一行位併發送它。我可以創建一個無符號字符*並連接R,G和B,然後發送這些。我只是做了序列化

+1

+1爲例;) – jcolebrand 2010-11-14 03:47:17

0

對於任何比基元或基元的同質運行更復雜的事情,是的。

3

是的,串行化是通過線路傳輸數據的唯一方式。考慮序列化的目的是什麼。您可以定義類存儲的方式。在記憶中,你無法準確地知道班級的每一部分在哪裏。特別是如果你有,例如,一個列表,如果它被提前分配,然後重新分配,它可能在整個地方被分割,所以它不是一塊連續的內存塊。你如何通過線路發送這個零散的課程?

對於這個問題,如果您通過電匯發送List<ComplexType>,它如何知道每個ComplexType開始和結束的位置。

4

某些類型的序列化是必需的,但這可能有多種形式。它可以是類似dotNET序列化的東西,由語言處理,也可以是定製的格式。也許是一系列字節,其中每個字節代表一些只有您和您的應用程序能夠理解的「魔法值」。

例如,在dotNET中,我可以創建一個具有單個字符串屬性的類,將其標記爲可序列化,並且dotNET框架負責處理其他大部分內容。

我還可以構建自己的自定義格式,其中前4個字節表示要發送的數據的長度,並且所有後續字節都是字符串中的字符。但當然你需要擔心字節順序,Unicode和ANSI編碼等。

通常,使用你的語言/操作系統/開發框架使用的任何框架都比較容易,但它不是必需的。

+0

+1爲好答案 – jcolebrand 2010-11-14 03:48:44

0

二進制序列化不是唯一的選擇。例如,您也可以將對象序列化爲XML文件。或者作爲JSON。

+0

使用XML通過二進制 – user770022 2010-11-14 03:46:44

+0

通過網絡線路有什麼優勢?你不能。爲了存儲在一個文件?可讀性。 – jcolebrand 2010-11-14 03:47:52

+1

XML的優點是能夠解析它的庫的可用性。理論上,使用XML可以使序列化格式更容易跨平臺移植。甚至有標準,如SOAP。可讀性可以是一個優點,但是... XML是冗長的,因此在實踐中往往不那麼可讀。 XML的缺點是冗長,數據量大,可能會影響性能。 – Eilistraee 2010-11-14 09:02:09

1

這裏真正的問題是沒有越過電線,問題最終與電線另一側的相同語義對象結束。爲了在不同的系統之間正確傳輸數據 - 無論是通過TCP/IP,軟盤還是打卡 - 數據必須被編碼(串行化)爲獨立於平臺的表示形式。

由於對齊和類型大小的問題,如果您嘗試執行對象的直接二進制傳輸,則會導致未定義行爲(借用C/C++標準中的定義)。

例如,long datatype的大小和對齊方式在架構,平臺,語言甚至相同編譯器的不同構建之間可能不同。

0

我想你問的是錯誤的問題。序列化是計算機編程中的一個概念,對於被認爲是序列化機制的某些東西,必須滿足某些要求。

準備數據的任何方法,以便可以以另一種程序(包括但不限於另一個系統上或另一時間的同一程序的另一個實例)讀取數據並將其重新存儲的方式傳輸或存儲 - 實例化數據所代表的任何對象。

注意我在這裏放下了「對象」一詞。如果我編寫一個程序,將一堆文本存儲在一個文件中;我後來使用其他程序或第一個程序的某個實例來讀取這些數據......我還沒有真正使用過「序列化」機制。如果我以這樣的方式編寫文本,那麼文本也會以某種關於它如何被操縱的狀態存儲......這可能需要序列化。

該術語主要用於表達行爲和狀態的活動組合正在呈現爲可由另一個程序/實例讀取並實例化的形式的概念。大多數序列化機制都綁定到特定的編程語言或虛擬機系統(Java VM,C#VM等;不屬於「VMware」虛擬機的意義上)。 JSON(和YAML)是一個明顯的例外。它們表示具有合理相似的語義的相當接近的對象類的數據,使得它們可以以有意義的方式在多種不同的編程語言中被實例化。

並不是說所有的數據傳輸或存儲都需要「序列化」......是某些存儲和傳輸數據的方式可用於序列化。在非常清單中,必須能夠消除編程語言支持的數據類型。如果它讀取:1必須知道是文本還是整數或實數(相當於1.0)還是一位。

0

嚴格來說它不是只有選項;你可以說「遠程處理」符合文本中的含義;這裏在接收器上創建一個假對象,其中包含無狀態。所有呼叫(方法,屬性等)都被攔截,只有調用結果被傳送。這樣就避免了傳輸對象本身的需要,但是如果涉及過度「嘮叨」的使用(即多次調用),因爲每個對象都具有光速的延遲(相加),可能會變得非常昂貴。

但是,「遠程處理」現在已經過時了。大多數情況下,是的:對象需要以某種方式進行序列化和反序列化(這裏有批次的選項)。該段非常正確。

2

是否需要序列化來傳輸數據?

字面上沒有。

可以想象,您可以將數據從一個地址空間移動到另一個地址空間而無需序列化。例如,使用分佈式虛擬內存的假設系統可以通過發送頁面將數據/對象從一臺機器移動到另一臺機器......而無需任何特定的序列化步驟。

而在一臺機器內,對象可以通過切換頁面從一個虛擬地址空間傳輸到另一個虛擬地址空間。

但實際上,答案是肯定的。我不知道有任何主流技術可以這樣工作。

+0

取決於你的意思是「電線」。引用可能意味着固有的字節序列(文件,簡單內存模型下的內存,通常API下的網絡連接),因此根據定義,這些方法傳輸的數據將被序列化。問題是「電線」 - 如果我的電線是實際的電線,我可以用繩子將一個勺子綁在它上面並將它滑到另一端。並不意味着我已經序列化勺子;-)任何激進的傳輸協議都會發送字節以外的內容。也許不是湯匙。 – 2010-11-14 14:03:34

+0

@Steve Jessop - 它完全取決於您如何解釋短語*「將數據結構或對象轉換爲位序列的過程」*。我認爲,在一個基於頁面的方案中,這不會發生。顯然沒有*數據結構*或*對象*的轉換,並且即使在頁面級別,數據也被複制而不是從一個不同的表示轉換爲另一個。 – 2010-11-14 21:26:44

+0

是的,但我想知道發送一頁數據「跨越網絡」是什麼意思。如果「穿越線」意味着通過UART或TCP/IP連接或任何類型的連接,那麼無論您如何切割,您都會在某個級別將該頁面表示爲字節,即使您的抽象級別更高你可以談論這個頁面「只是移動」。如果你將某種物理內存從一臺機器上熱切換到另一臺機器上,那麼肯定它從來沒有序列化過。它是非常並行的;-) – 2010-11-14 21:43:45

0

將消息作爲對象並序列化爲字節是瞭解和管理通過有線傳輸的內容的更好方式。在過去,協議和數據非常簡單,通常程序員只是將字節放入輸出流中。通過具有衆所周知的簡單規範來共同理解。

0

我想說序列化是需要將對象存儲在文件中以進行持久化,但是當我們解序列化時,動態分配的對象中的指針需要重新構建,但是用於傳輸的序列化取決於物理協議和使用的機制,例如,如果我使用UART傳輸數據,然後將其串行化,但如果我使用並行端口,那麼8位一起得到傳輸,這是不是序列化

相關問題