2010-11-12 7 views
6

Publiqué una duda que encontré leyendo Java efectivo. Me disculpo si es una duda realmente simple y directa. Entonces, en Elemento 74 - Implemente Serializable juiciosamente, Él dice que incluso después de implementar una buena ocultación de información en su clase usando campos privados y paquetes privados, es propenso a perder efectividad? Todo lo que leí en el pasado fue, toda la serialización es, convertir objetos en formato de secuencia de bytes y después de la deserialización, el mismo objeto se retiene. ¿Cómo pierde Data Hiding en este proceso?Java Serialization

Respuesta

4

Es posible que tenga acceso al valor del estado interno de un objeto utilizando serialización y deserialización.

Al serializar un objeto, es posible que pueda leer los valores de los campos privados que de otro modo no debería. Por el contrario, si crea una matriz de bytes bien elaborada que deserialice en una instancia, es posible que pueda inicializarla en un estado ilegal.

+0

Hmmm .. ¿significa esto que cada vez que serializamos un objeto, perdemos la garantía de que Data Hiding podría no funcionar de la manera que queríamos que funcione? – t0mcat

+1

Bueno, en cierto sentido, sí, pero si cree que esto puede causar problemas, siempre puede anular el método readObject(), verificar el estado usted mismo y lanzar una excepción si viola alguna restricción. En cuanto a los valores de acceso, en la mayoría de los casos prácticos esto no es un gran problema. – candiru

0

Problema de ocultación de datos con Serialización en contexto de OOP es señalado por @candiru.

Pero hay otro aspecto también con Serialization.

Puede enviar un archivo serializado a través de la red para que pueda ser visto y las cosas que se supone que son privadas pueden verse fácilmente comprometidas.

A continuación se muestra el contenido de una clase de Bean que serialicé (utilizando la técnica predeterminada). Pude ver el contenido abriendo el archivo serializado en un editor de texto.

’ sr SerializationPractice1 I ageL extrat Ljava/lang/String;L nameq ~ xp
pt SidKumarq ~ x

Ahora se puede encontrar fácilmente por debajo de las cosas sin saber siquiera acerca de la clase:

  1. Nombre de la clase: SerializationPractice1
  2. Un atributo de cadena denominada como nombre valor es SidKumar

Estas cosas se nota con certeza; otros detalles no son tan claros. Y la información anterior es correcta.

0

Creo que la serialización tiene el potencial de exponer datos privados al mundo exterior. Y ahí es donde Externalizar (usar instancias de tipo Externalizable es muy útil). Al implementar el método writeExternal (...) de la interfaz Externalizable, el desarrollador tiene control total sobre el proceso de serialización en lugar de depender completamente de la implementación de tiempo de ejecución de serialización predeterminada. A continuación se muestra el pseudo-código para mi idea (I estaría haciendo caso omiso de las firmas de los métodos actuales, ya que es mera un pseudo-código que nos permitirá mantener a través de la idea más amplia):

class SensitiveData implemets java.io.Externalizable{ 

     int sensitiveInteger; 
     writeExternal (OutputData outputData){ 
      //encrypt sensitiveInteger here 
      //serialize the sensitiveInteger which is now encrypted to any persistent store 
      outputData.writeInt(sensitiveInteger); 
      //do other processing 
    } 
} 

De hecho, ¿por qué sólo el cifrado, nos bien podría querer comprimir los bytes serializados en algún almacén persistente si queremos en algunas situaciones donde la instancia que se serializará es 'grande'.

Cuestiones relacionadas