[英]Can we deny a java object from serialization other than giving transient keyword
我們可以通過使用transient
關鍵字來避免序列化字段。 還有其他辦法嗎?
http://java.sun.com/javase/6/docs/platform/serialization/spec/security.html
摘要:防止敏感數據的序列化不應序列化包含敏感數據的字段; 這樣做會將其值暴露給有權訪問序列化流的任何一方。 有幾種方法可以防止字段序列化:
- 將該字段聲明為私有瞬態。
- 定義相關類的serialPersistentFields字段,並省略字段描述符列表中的字段。
- 編寫特定於類的序列化方法(即writeObject或writeExternal),該方法不將字段寫入序列化流(即,不調用ObjectOutputStream.defaultWriteObject)。
這是一些鏈接。
如果由於某種原因,瞬態不適合,可以通過覆蓋writeObject和readObject方法直接進行序列化。 然后,您可以包含或省略所需的任何字段。
這就是瞬態意味着作為關鍵字。 它的全部目的是無論出於何種原因停止數據的序列化。
如果您希望對流程進行更精細的控制,可以使用ObjectOutputStream / ObjectInputStream作為序列化過程一部分使用的writeObject / readObject方法,並且可以將其與某些自定義注釋或您想要的任何邏輯相結合。
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException;
private void writeObject(java.io.ObjectOutputStream stream)
throws IOException
您可以使用Externalizable接口創建自己的協議,在我看來,它比Serializable更好,因為它不包含JVM( writeObject
和readObject
)掛鈎的私有方法。 您可以實現Externalizable
,而不是實現Serializable
接口,它包含兩個方法:
public void writeExternal(ObjectOutput out) throws IOException;
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
與使用Serializable
不同,現在不提供免費服務。 也就是說, 協議完全由您掌控,可以覆蓋瞬態/非三態場等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.