我们可以使用transient
关键字来避免序列化字段。
还有其他办法吗?
答案 0 :(得分:18)
http://java.sun.com/javase/6/docs/platform/serialization/spec/security.html
摘要:防止序列化 敏感数据字段包含 敏感数据不应该 系列化;这样做会暴露他们的 对有权访问的任何一方的价值观 序列化流。有 几种防止田地的方法 从序列化:
- 将该字段声明为私有瞬态。
- 定义serialPersistentFields 有问题的班级的领域,和 省略列表中的字段 字段描述符。
- 编写特定于类的序列化 方法(即writeObject或 writeExternal)不写 字段到序列化 流(即不通过呼叫 ObjectOutputStream.defaultWriteObject)。
醇>
以下是一些链接。
Declaring serialPersistenetFields.
答案 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
不同,现在没有免费提供。也就是说,协议完全在您手中,覆盖瞬态/非三重字段等。