2010-11-12 69 views
6

我發帖懷疑我碰到過閱讀Effective Java。我很抱歉,如果它是一個真正簡單而直接的疑問。因此,在第74項 - 明智地實現可序列化,他說即使在使用私人和包裝私人領域對您的班級實施了良好的信息隱藏後,它也容易失去效力?無論我過去讀過的是什麼,所有的序列化都會將對象轉換爲字節流形式,並在反序列化後保留相同的對象。它在這個過程中如何失去數據隱藏?Java序列化

回答

4

您可能可以使用序列化和反序列化訪問對象的內部狀態的值。

通過序列化一個對象,您可能能夠讀取專門的字段的值,否則您不應該讀取這些值。相反,如果您創建一個精心製作的字節數組,並將其反序列化爲一個實例,則可能會將其初始化爲非法狀態。

+0

嗯......這意味着,無論何時我們序列化一個對象,我們都失去了保證Data Hiding可能無法按照我們希望它工作的方式工作? – t0mcat 2010-11-12 16:58:33

+1

從某種意義上說,是的,但是如果您認爲這可能會導致問題,您可以始終重寫readObject()方法,自己檢查狀態,並在違反某些約束時拋出異常。至於訪問價值,在大多數實際情況下,這不是一個大問題。 – candiru 2010-11-12 17:06:37

0

數據隱藏問題OOP環境下的序列化由@candiru指向。

但還有另一個方面,以及序列化

您可以通過網絡發送序列化文件,以便它可以被窺視,並且應該是私密的東西可以很容易受到損害。

下面是我序列化的一個Bean類的內容(使用默認技術)。我可以通過在文本編輯器中打開序列化文件來查看內容。

’ sr SerializationPractice1 I ageL extrat Ljava/lang/String;L nameq ~ xp
pt SidKumarq ~ x

現在,你可以很容易地找到下面的東西,甚至不知道關於類:

  1. 類的名稱:SerializationPractice1
  2. 命名爲名稱的字符串屬性SidKumar

你可以注意到這些東西;其他細節不太清楚。以上信息是正確的。

0

我確實認爲序列化可能會將私人數據暴露給外部世界。這就是外部化(使用Externalizable類型的實例非常方便)的地方。通過實現Externalizable接口的writeExternal(...)方法,開發人員可以完全控制序列化過程,而不是完全依賴默認的序列化運行時實現。下面是我的想法的僞代碼(我會無視實際的方法簽名,因爲它是純粹的僞代碼,旨在跨廣泛的主意,把):

class SensitiveData implemets java.io.Externalizable{ 

     int sensitiveInteger; 
     writeExternal (OutputData outputData){ 
      //encrypt sensitiveInteger here 
      //serialize the sensitiveInteger which is now encrypted to any persistent store 
      outputData.writeInt(sensitiveInteger); 
      //do other processing 
    } 
} 

其實,爲什麼單單加密,我們如果我們想要在需要序列化的實例是'big'的情況下想要將字節序列化到某個持久性存儲區,可能會想要壓縮這些字節。