Serializzazione Java per archiviazione a lungo termine

1

Ho un'applicazione che utilizza un database di circa 15.000 oggetti Java, che devo leggere ogni volta che si avvia l'applicazione. Inizialmente ho usato JSON per archiviare i dati, ma questo ha alcuni problemi, soprattutto che è lento (ci possono volere 8-10 secondi per leggere tutti gli oggetti sul mio computer di fascia bassa) e anche, è molto comune per gli oggetti nel mio database per avere campi che puntano allo stesso oggetto. La serializzazione Java gestisce questo usando riferimenti allo stesso oggetto, mentre con JSON, devo solo scrivere lo stato di ogni oggetto e poi internarli durante la lettura. Ciò complica anche la dimensione del file.

Il contenuto di questo database verrà aggiornato abbastanza di rado (forse circa una volta al mese circa). Ho sentito da praticamente ogni fonte che la serializzazione Java è sempre una scelta sbagliata per l'archiviazione a lungo termine, e capisco perché. Date queste condizioni, tuttavia, esiste una buona ragione per non utilizzare la serializzazione Java qui?

    
posta codebreaker 29.09.2014 - 19:40
fonte

3 risposte

3

Anche se non prevedi di cambiare molto la natura dei tuoi oggetti, è necessario che cambino nel tempo.

Suggerisco vivamente di prendere in considerazione l'utilizzo di protobuf o Apache Thrift o un design simile invece di basarsi sulla serializzazione Java predefinita.

I loro vantaggi includono un strong supporto per evitare l'impatto durante le modifiche minori della versione, la serializzazione e la velocità di deserializzazione significativamente migliori e l'ingombro ridotto degli oggetti.

Quando lo faccio, tipicamente includo la versione del messaggio come un campo sull'oggetto. Questo mi consente di implementare le modifiche da versione a versione durante la serializzazione avvolgendo quel metodo, se tale necessità dovesse insorgere in futuro.

    
risposta data 29.09.2014 - 22:51
fonte
0

Non conserverei gli oggetti serializzati a lungo termine. Come già affermato dagli altri: quando cambi un punto sulle tue lezioni, (forse non te ne accorgi nemmeno) forse non puoi caricare i tuoi dati. Sarà un inferno ripararlo.

Non sono sicuro, perché hai bisogno di tutti i dati nella memoria. È, perché viene utilizzato sempre e ovunque nel tuo software (dati master)? Sembra un "Sì"

Cosa farei: Vorrei memorizzare i dati in un database inmemory (hsqldb, ...) scaricare il file e fornire il file sulla macchina Dopo l'avvio vorrei caricare il file (abbastanza velocemente) e poi usarlo come un database "normale".

Puoi farlo anche con i tuoi oggetti serializzati. Ma non avrei più senso. Il database "normale" può essere memorizzato nella cache e sarà estremamente veloce. Quindi interrogare l'oggetto.

    
risposta data 29.09.2014 - 23:13
fonte
0

Sono d'accordo con i commenti sul fatto che la serializzazione Java è instabile e difficile da mantenere man mano che le classi cambiano. Raccomando di scrivere la tua routine di lettura / scrittura su un formato comprensibile per gli umani e modificabile manualmente (se necessario). Puoi probabilmente lo impacchettiamo come dati statici che verranno digeriti nei dati di runtime struttura principalmente dal compilatore.

    
risposta data 30.09.2014 - 04:07
fonte

Leggi altre domande sui tag