簡體   English   中英

除了給出transient關鍵字之外,我們能否從序列化中拒絕java對象

[英]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

摘要:防止敏感數據的序列化不應序列化包含敏感數據的字段; 這樣做會將其值暴露給有權訪問序列化流的任何一方。 有幾種方法可以防止字段序列化:

  1. 將該字段聲明為私有瞬態。
  2. 定義相關類的serialPersistentFields字段,並省略字段描述符列表中的字段。
  3. 編寫特定於類的序列化方法(即writeObject或writeExternal),該方法不將字段寫入序列化流(即,不調用ObjectOutputStream.defaultWriteObject)。

這是一些鏈接。

聲明serialPersistenetFields。

序列化體系結構規范。

對象序列化中的安全性。

如果由於某種原因,瞬態不適合,可以通過覆蓋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( writeObjectreadObject )掛鈎的私有方法。 您可以實現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.

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