2009-08-18 11 views
10

Podemos evitar la serialización de campos utilizando la palabra clave transient. ¿Hay alguna otra forma de hacerlo?Podemos negar un objeto java de la serialización que no sea la palabra clave transitoria

+0

tengo esta pregunta ... preguntando si podemos hacerlo a través de un nativo ... –

+0

¿Para qué propósito? ¿Por qué la transitoria no es una buena solución para sus casos de uso? – GaryF

+0

@ Bombe/@ GaryF: la curiosidad siempre es una razón válida. –

Respuesta

18

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

RESUMEN: Prevención de la serialización de campos de datos sensibles que contienen datos sensibles no debe ser serializado; al hacerlo, expone sus valores a cualquier parte con acceso a la secuencia de serialización . Hay varios métodos para prevenir un campo de ser serializado:

  1. declarar el campo como transitorio privado.
  2. Defina el campo serialPersistentFields de la clase en cuestión, y omita el campo de la lista de descriptores de campo .
  3. escribir un método de serialización específico de clase (es decir, writeObject o writeExternal), que no escribe el campo a la corriente de serialización (es decir, al no presentarse ObjectOutputStream.defaultWriteObject).

Aquí hay algunos enlaces.

Declaring serialPersistenetFields.

Serialization architecture specification.

Security in Object Serialization.

+0

¿puede explicar el segundo método en detalle ... –

+0

declarar serialPersistenetFields - Esto se hace usando una variable final estática especial llamada serialPersistentFields. – adatapost

7

Si por alguna razón transitoria no se adapta, puede hacer la serialización directamente anulando los métodos writeObject and readObject. Luego puede incluir u omitir cualquier campo que necesite.

6

Esto es lo que significa transitorios como una palabra clave. Todo su propósito es detener la serialización de los datos por cualquier razón.

Si desea un control de grano más fino sobre el proceso puede usar los métodos writeObject/readObject que ObjectOutputStream/ObjectInputStream usa como parte del proceso de serialización, y puede combinar eso con algunas anotaciones personalizadas o cualquier lógica que desee.

private void readObject(java.io.ObjectInputStream stream) 
throws IOException, ClassNotFoundException; 
private void writeObject(java.io.ObjectOutputStream stream) 
throws IOException 
3

puede crear su propio protocolo con la interfaz Externalizable, que en mi opinión es mejor que un Serializable, ya que no contiene métodos privados enganchados por la JVM (writeObject y readObject). En lugar de implementar la interfaz Serializable, puede implementar Externalizable, que contiene dos métodos:

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

A diferencia del uso Serializable nada se proporciona de forma gratuita ahora, sin embargo. Es decir, el protocolo está completamente en sus manos, sobrepasando campos transitorios/no trianuales, etc.

Cuestiones relacionadas