14

我们可以通过使用transient关键字来避免序列化字段。有没有其他方法可以做到这一点?

4

4 回答 4

20

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

摘要:防止敏感数据的序列化包含敏感数据的字段不应该被序列化;这样做会将它们的值暴露给可以访问序列化流的任何一方。有几种方法可以防止字段被序列化:

  1. 将该字段声明为私有瞬态。
  2. 定义相关类的 serialPersistentFields 字段,并从字段描述符列表中省略该字段。
  3. 编写一个特定于类的序列化方法(即 writeObject 或 writeExternal),它不会将字段写入序列化流(即,通过不调用 ObjectOutputStream.defaultWriteObject)。

这里有一些链接。

声明 serialPersistenetFields。

序列化架构规范。

对象序列化中的安全性。

于 2009-08-18T08:18:25.120 回答
9

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

于 2009-08-18T08:17:39.787 回答
8

这就是瞬态作为关键字的含义。它的全部目的是为了任何原因停止数据的序列化。

如果您想对流程进行更精细的控制,您可以使用 ObjectOutputStream/ObjectInputStream 用作序列化流程的一部分的 writeObject/readObject 方法,您可以将其与一些自定义注释或您想要的任何逻辑相结合。

private void readObject(java.io.ObjectInputStream stream)
 throws IOException, ClassNotFoundException;
private void writeObject(java.io.ObjectOutputStream stream)
 throws IOException
于 2009-08-18T08:18:49.597 回答
5

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

public void writeExternal(ObjectOutput out) throws IOException;
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException

不过,不像Serializable现在免费提供任何东西。也就是说,协议完全掌握在您手中,覆盖瞬态/非瞬态字段等。

于 2009-08-18T08:23:07.640 回答