2011-11-29 11 views
7

Sono stato avvisato di non utilizzare le raccolte immutabili di Guava negli oggetti utilizzati nelle comunicazioni serializzate perché se la versione di Guava su un'estremità è stata aggiornata, potrebbero esserci problemi di incompatibilità della versione di serializzazione. È una preoccupazione valida?La serializzazione delle collezioni immutabili Guava è stabile?

+3

Questo può essere un problema con qualsiasi classe: si desidera che le versioni della libreria siano le stesse sul lato di invio e di destinazione. – SteveD

risposta

5

Sì, è un problema valido.

Dalla home page del progetto Guava (http://code.google.com/p/guava-libraries/):

forme serializzati di tutti gli oggetti sono soggetti a modifiche. Non persistere e presumere che possano essere letti da una versione futura della libreria.

Se si utilizza la serializzazione nativa Java, Guava non è una buona scelta.

+2

Solo "non è una buona scelta" se non è possibile controllare quale versione viene utilizzata su entrambi i lati della comunicazione. – SteveD

+1

Che schifo. Le collezioni immutabili dovrebbero essere stabili ormai. Perché dovrebbero cambiare i moduli serializzati? –

+1

Mantenere la compatibilità di serializzazione tra diverse versioni di strutture di dati è davvero difficile. Vedi alcuni dei messaggi successivi in ​​questo [thread di mailing list] (https://groups.google.com/group/guava-discuss/browse_thread/thread/eae0b4232496d2b3/020c9f58640f2263) per alcuni dei motivi. –

7

Diamo una prospettiva.

Gli usi più importanti di serializzazione sono:

  1. memorizzare i dati in tra le piste della vostra applicazione
  2. l'invio di dati tra un client e un server

Guava è totalmente soddisfacente per l'applicazione 2 , se si controlla quale versione di Guava viene utilizzata sia sul client che sul server. Inoltre, mentre Guava non offre garanzie sulla coerenza della serializzazione tra le versioni di Guava ... in realtà, le forme serializzate non cambiano molto spesso.

D'altra parte, vorrei dare qualche prospettiva sul motivo per cui Guava non garantisce la coerenza delle forme serializzate. Ho cambiato la forma serializzata di ImmutableMultiset tra le versioni 9 e 10 di Guava, e il motivo per cui è stato perché avevo bisogno di refactoring, così ho potuto aggiungere ImmutableSortedMultiset alle collezioni immutabili. Puoi vedere tu stesso il cambiamento here. Provare a fare questo stesso refactoring mantenendo le forme serializzate coerenti avrebbe quasi certamente richiesto altri hack complicati, che sono ... piuttosto fortemente contro la filosofia del team Guava. (Potrebbe essere stato possibile da un programmatore più esperto di me, ma continuo a sostenere che non sarebbe stato banale.) Garantire la compatibilità della serializzazione a lungo termine avrebbe richiesto enormi sforzi, come discusso nello above linked mailing list thread, ha affermato Kevin :

Cercando di prevedere cross-versione di compatibilità cose fatte un centinaio di volte più difficili e abbiamo rinunciato su di esso prima Guava neanche iniziato.

e Jared:

Il problema di fondo è ancora lì: assicurare che le forme serializzati sono compatibili tra tutte le versioni Guava. Questo era un mio obiettivo quando lavorava verso Google Collections 1.0, ma ho abbandonato quell'obiettivo dopo lo rendendoci conto della sua difficoltà. Implementare e testare la compatibilità cross-version non valeva la pena.

Infine, sottolineerò che Guava viene utilizzato internamente a Google in tutto il luogo e gestisce piuttosto bene.

Problemi correlati