除了给出transient关键字之外,我们能否从序列化中拒绝java对象

时间:2009-08-18 08:10:27

标签: java serialization java-custom-serialization

我们可以使用transient关键字来避免序列化字段。 还有其他办法吗?

4 个答案:

答案 0 :(得分:18)

http://java.sun.com/javase/6/docs/platform/serialization/spec/security.html

  

摘要:防止序列化   敏感数据字段包含   敏感数据不应该   系列化;这样做会暴露他们的   对有权访问的任何一方的价值观   序列化流。有   几种防止田地的方法   从序列化:

     
      
  1. 将该字段声明为私有瞬态。
  2.   
  3. 定义serialPersistentFields   有问题的班级的领域,和   省略列表中的字段   字段描述符。
  4.   
  5. 编写特定于类的序列化   方法(即writeObject或   writeExternal)不写   字段到序列化   流(即不通过呼叫   ObjectOutputStream.defaultWriteObject)。
  6.   

以下是一些链接。

Declaring serialPersistenetFields.

Serialization architecture specification.

Security in Object Serialization.

答案 1 :(得分:7)

如果出于某种原因,瞬态不适合,您可以通过覆盖writeObject and readObject方法直接进行序列化。然后,您可以包含或省略您需要的任何字段。

答案 2 :(得分:6)

这就是瞬态意味着作为关键字。它的全部目的是无论出于何种原因停止数据的序列化。

如果你想对进程进行更细粒度的控制,你可以使用ObjectOutputStream / ObjectInputStream作为序列化过程一部分使用的writeObject / readObject方法,你可以将它与一些自定义注释或你想要的任何逻辑结合起来。 / p>

private void readObject(java.io.ObjectInputStream stream)
 throws IOException, ClassNotFoundException;
private void writeObject(java.io.ObjectOutputStream stream)
 throws IOException

答案 3 :(得分:3)

您可以使用Externalizable接口创建自己的协议,在我看来,它比Serializable更好,因为它不包含JVM挂钩的私有方法(writeObject和{{1} })。您可以实现readObject,而不是实现Serializable接口,其中包含两个方法:

Externalizable

与使用public void writeExternal(ObjectOutput out) throws IOException; public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException 不同,现在没有免费提供。也就是说,协议完全在您手中,覆盖瞬态/非三重字段等。