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

我们可以通过使用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不同,现在不提供免费服务。 也就是说, 协议完全掌握在您的手中 ,覆盖瞬态/非快速字段等。