2010-11-12 19 views
6

Invio un dubbio sul fatto che mi sia capitato di leggere Effective Java. Mi scuso se si tratta di un dubbio semplice e diretto. Quindi in Voce 74 - Implementare seriamente serializzabile, Sta dicendo che anche dopo aver implementato un buon Nascondere Informazioni sulla tua classe usando campi privati ​​e pacchetti privati, è soggetto a perdere efficacia? Qualunque cosa abbia letto in passato era, tutta la serializzazione è, convertire gli oggetti in forma di flusso Byte e dopo la deserializzazione lo stesso oggetto viene trattenuto. In che modo perde i dati nascosti in questo processo?Serializzazione Java

risposta

4

Potresti avere accesso al valore dello stato interno di un oggetto utilizzando la serializzazione e la deserializzazione.

serializzando un oggetto, potresti essere in grado di leggere i valori dei campi privati ​​che altrimenti non dovresti. Viceversa, se si crea un array di byte ben progettato che si deserializza in un'istanza, è possibile inizializzarlo in uno stato non valido.

+0

Hmmm .. questo significa che, ogni volta che serializziamo un oggetto, perdiamo la garanzia che Data Hiding potrebbe non funzionare nel modo in cui volevamo che funzionasse? – t0mcat

+1

Beh, in un certo senso sì, ma se pensi che questo possa causare problemi, puoi sempre sovrascrivere il metodo readObject(), controllarlo tu stesso e lanciare un'eccezione se viola qualche vincolo. Per quanto riguarda l'accesso ai valori, nella maggior parte dei casi pratici questo non è un grosso problema. – candiru

0

Problema di occultamento dei dati con La serializzazione nel contesto di OOP è indicata da @candiru.

Ma c'è anche un altro aspetto con la serializzazione .

È possibile inviare file serializzati attraverso la rete in modo che possano essere captati e le cose che dovrebbero essere private possono essere facilmente compromesse.

Di seguito è il contenuto di una classe Bean che ho serializzato (utilizzando la tecnica predefinita). Potrei visualizzare il contenuto aprendo il file serializzato in un editor di testo.

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

Ora si può facilmente trovare qui di seguito le cose senza nemmeno sapere sulla classe:

  1. Nome della classe: SerializationPractice1
  2. un attributo di stringa di nome come nome valore è SidKumar

Queste cose si possono notare con certezza; altri dettagli non sono così chiari. E le informazioni di cui sopra sono corrette.

0

Credo che la serializzazione abbia il potenziale di esporre i dati privati ​​al mondo esterno. Ed è qui che l'esternalizzazione (usando le istanze di tipo Externalizable sono molto utili). Implementando il metodo writeExternal (...) dell'interfaccia Externalizable, lo sviluppatore ha il pieno controllo del processo di serializzazione piuttosto che affidarsi completamente all'implementazione di runtime di serializzazione predefinita. Qui di seguito è la pseudo-codice per la mia idea (sarei ignorando le firme dei metodi attuali come è mera un pseudo-codice destinato a far passare l'idea più ampia):

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 
    } 
} 

In realtà, il motivo per cui solo la crittografia, abbiamo potrebbe volere comprimere i byte serializzati in qualche archivio persistente se vogliamo in alcune situazioni in cui l'istanza da serializzare è 'grande'.

Problemi correlati