簡體   English   中英

已編組和未編組的對象

[英]object marshalled and unmarshalled

對象編組和解組是什么意思? 上述操作發生時對對象狀態有什么影響,即序列化對hashCodeequals

編組對象是將其轉換為適合序列化存儲或傳輸的形式; 也就是說,將其從 JVM 內存中的本機形式轉換為可以通過線路發送、插入文件/數據庫等的形式。具體取決於所涉及的編組形式; Java 的默認序列化機制是一種方式,但將對象轉換為 XML 或 JSON 表示同樣有效。

解組只是這個過程的反面/另一面; 獲取由編組創建的對象的表示,並使用它在 JVM 中重建對象實例。


老實說,我不確定你問題的另一部分到底是什么意思。 原始對象通常不會被編組更改(這在概念上是只讀操作,如復制)。 所以它的哈希碼等將保持不變。

根據定義,對象的未編組副本將具有與原始對象相同的邏輯狀態(畢竟這是編組的重點,以便能夠重現等效對象)。 所以在這方面它的狀態,即它的字段的值,是相同的。 但是,如果哈希碼取決於環境因素——例如機器的主機名或存儲實例的內存地址——那么它當然可能會報告不同的東西。 這與默認的Object.hashCode()實現特別相關,其中對象的內存位置很重要。 (但這與編組無關;在這種情況下,以任何方式在同一 JVM 中獲取對象的“完美副本”仍然會導致不同的哈希碼。)

編組意味着生成一個字節流,其中包含足夠的信息以能夠重新構建對象。

這對原始對象沒有影響,它是一個只讀操作。 解組導致創建另一個不相關的對象(通常)。

副本很可能具有相同的hashCode()並且是equals() == truecompareTo() == 0 (假設它的 Comparable )。

編組幾乎與序列化相同。 區別(在 Java 上下文中)在於遠程對象處理,如rfc2713 中所指定。

至於哈希碼值:這取決於對象如何計算其哈希碼。 如果僅從字段計算,則顯然與未編組的對象等於原始對象相同 但是,如果它使用Object的原始hashCode ,那么它就是 JVM 碰巧賦予該對象的任何內容,並且會因實例而異。

在 C++ 中,如果您一般從存儲對象的內存塊中生成哈希碼,則在未編組的對象中可能會有所不同。

第一個指針值不同。 其次由於系統加載程序對二進制文件的重定位, vtbl 指針是不同的。

它用於保存對象或將它們發送到另一個例如 Java 世界中的 VM。 如果您已編組所有信息,則在編組后對象將被重建為相同。

例如,您可以標記字段,以便它們在序列化中丟失,然后您無法完全重新創建對象。

很可能狀態丟失了,這也是由於您通常不序列化狀態,而是只序列化 bean 持有的數據。 例如,您序列化字段地址 您不會序列化狀態“當前正在查看對象的 2 個人”。

編組是將對象中存在的數據轉換為 xml 格式並以 xml 格式查看它,而解組與將 xml 文件轉換為對象相反

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM