我们可以通过使用transient
关键字来避免序列化字段。有没有其他方法可以做到这一点?
4 回答
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
) 挂钩的私有方法。Serializable
您可以实现接口,而不是实现接口Externalizable
,它包含两个方法:
public void writeExternal(ObjectOutput out) throws IOException;
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
不过,不像Serializable
现在免费提供任何东西。也就是说,协议完全掌握在您手中,覆盖瞬态/非瞬态字段等。