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

Bij*_* CD 11 java serialization java-custom-serialization

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

ada*_*ost 18

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

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

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

这是一些链接.

声明serialPersistenetFields.

序列化体系结构规范.

对象序列化中的安全性.


T.J*_*der 8

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


Pau*_*ble 7

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

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

private void readObject(java.io.ObjectInputStream stream)
 throws IOException, ClassNotFoundException;
private void writeObject(java.io.ObjectOutputStream stream)
 throws IOException
Run Code Online (Sandbox Code Playgroud)


dfa*_*dfa 5

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

public void writeExternal(ObjectOutput out) throws IOException;
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
Run Code Online (Sandbox Code Playgroud)

与使用Serializable什么都不一样,现在免费提供。也就是说,协议完全掌握在你手中,覆盖瞬态/非三角场等。