Serializzazione Java: vantaggi e svantaggi, usare o evitare? [chiuso]

20

La serializzazione viene utilizzata per la persistenza in Java. Potrebbe essere ok per mantenere alcuni oggetti usando la serializzazione. Ma, per un gran numero di oggetti, ORM, Database ecc potrebbe essere migliore. Sembra che la serializzazione sia utile solo per piccoli lavori. Potrebbe essere che ho torto. Quindi, per favore dimmelo quali sono i vantaggi della serializzazione rispetto ai metodi di non serializzazione? Quando dovrebbe essere usato e quando dovrebbe essere evitato?

Questa domanda mi è venuta in mente dopo aver visto l'articolo di DZone Object Serialization Evil?

E queste sono le linee che hanno dato origine alla mia domanda:

If you look at Java and its session objects, pure object serialization is used. Assuming that an application session is fairly short-lived, meaning at most a few hours, object serialization is simple, well supported and built into the Java concept of a session. However, when the data persistence is over a longer period of time, possibly days or weeks, and you have to worry about new releases of the application, serialization quickly becomes evil. As any good Java developer knows, if you plan to serialize an object, even in a session, you need a real serialization ID (serialVersionUID), not just a 1L, and you need to implement the Serializable interface. However, most developers do not know the real rules behind the Java deserialization process. If your object has changed, more than just adding simple fields to the object, it is possible that Java cannot deserialize the object correctly even if the serialization ID has not changed. Suddenly, you cannot retrieve your data any longer, which is inherently bad.

Now, may developers reading this may say that they would never write code that would have this problem. That may be true, but what about a library that you use or some other developer no longer employed by your company? Can you guarantee that this problem will never happen? The only way to guarantee that is to use a different serialization method.

    
posta sky scraper 20.03.2013 - 11:11
fonte

6 risposte

15

La serializzazione è principalmente utilizzata in due aree:

  • prototipazione della persistenza

    praticamente tutti gli oggetti grafici possono essere resi rapidamente serializzabili, per prove rapide di concetti o applicazioni veloci e sporche questo potrebbe essere più veloce di un vero strato ORM o altro sistema di persistenza

  • archiviazione a breve termine di oggetti quasi arbitrari:

    I server di applicazioni, ad esempio, hanno la tendenza a mantenere le informazioni sulla sessione utilizzando la serializzazione. Questo ha il vantaggio che i valori nella sessione possono essere praticamente di qualsiasi tipo (purché serializzabili).

Per quasi tutti gli altri usi, gli svantaggi che tu (e l'articolo) menzionano sono troppo grandi: il formato esatto è difficile da mantenere stabile, i cambiamenti di classe possono rendere facilmente illeggibili i dati serializzati, leggere / scrivere i dati in non Java il codice è quasi impossibile (o almeno molto più difficile del necessario).

JAXB e tecnologie simili offrono funzioni simili con un costo simile, riducendo al contempo alcuni dei problemi.

    
risposta data 20.03.2013 - 11:25
fonte
12

Uso la serializzazione degli oggetti per consentire l'analisi post-mortem in caso di un errore imprevisto nella produzione. Gli input per un calcolo sono serializzati su un file di dati. Se viene segnalato un errore, un semplice programma può ricaricare gli input e rieseguire il calcolo con un debugger collegato. Oppure puoi usare una shell groovy per ricaricare gli oggetti e modificarli se lo desideri.

Utilizziamo anche la serializzazione per passare oggetti Java tramite HTTP a un servizio web. Molto più facile della serializzazione da e verso il testo. Lo svantaggio è che le installazioni client e server devono essere implementate insieme, ma non è un problema dato che controlliamo entrambe le estremità.

    
risposta data 20.03.2013 - 15:06
fonte
7

What are the advantages of serialization over non-serialization methods ?

La serializzazione Java presenta alcuni vantaggi:

  • Integrato nel sistema : non è necessario affidarsi a strumenti, librerie o configurazione di terze parti.

  • relativamente semplice da comprendere , almeno all'inizio.

  • Ogni sviluppatore lo sa (o dovrebbe). Indipendentemente dal fatto che gli sviluppatori Java approvi o disapprovi, è probabile che abbiano familiarità con la serializzazione di oggetti Java.

E, naturalmente, ci sono degli svantaggi:

  • Circumvents flusso Java standard. Assegna memoria ma non chiama un costruttore, quindi i campi transitori non vengono inizializzati. I campi sono inizializzati in ordine alfabetico, non come ordine sorgente.

  • Non così efficiente in termini di spazio, ma non è neanche orribile. Potresti voler comprimere il risultato.

  • fragile se non prendi precauzioni quando i tuoi oggetti cambiano. E anche allora.

When should it be used and when should it be avoided ?

Utilizza quando :

  • Le dimensioni della distribuzione sono importanti. Costruito nel sistema, quindi 0 byte extra.

  • Tutti gli attori useranno versioni compatibili.

  • Lo storage a lungo termine non è un problema.

Evita quando :

  • Qualsiasi dei precedenti non si applica.
risposta data 18.05.2014 - 18:59
fonte
3

La serializzazione e un ORM / database sono cose diverse, anche se c'è qualche sovrapposizione.

Un oggetto serializzato rappresenta tutte le informazioni necessarie per "scongelare" un oggetto persistente e ripopolare i suoi dati. Un ORM e un database conservano i dati in un database. Una classe può avere campi di informazione che non sono memorizzati nel database dall'ORM, ad esempio il campo calcolato.

Inoltre, la serializzazione e un ORM stanno risolvendo diversi problemi. La serializzazione risolve il problema di mantenere un grafico oggetto su un flusso (memoria, file system, ecc.). Un ORM gestisce la mappatura di informazioni sulle colonne del database e il recupero e l'istanziazione di oggetti, oltre a fornire sottigliezze come la ricerca e il caricamento lazy.

Utilizzare un ORM quando si desidera mantenere i dati su un database per situazioni in cui si ha a che fare con grandi quantità di dati o necessità di reportistica, ricerca / interrogazione, immagazzinamento o altre cose a cui i database sono abili. Utilizzare la serializzazione quando si desidera salvare una rappresentazione delle strutture dati sul disco.

    
risposta data 20.03.2013 - 11:24
fonte
0

La serializzazione è usata raramente nella pratica.

Come già accennato, il caso d'uso più comune per la serializzazione è quello di memorizzare oggetti come BLOB in un database di sessione. Questo funziona bene per due motivi: le sessioni tendono ad essere di breve durata, e il database di sessione non ha alcuna conoscenza su come mappare oggetti arbitrari su un modello relazionale.

Per i dati che devono essere conservati per lunghi periodi di tempo (come un carrello della spesa Amazon) la pratica migliore è quella di archiviare tali dati in un database.

Il meccanismo di persistenza della sessione garantisce che un utente con una sessione attiva venga restituito allo stesso server. Il database di sessione è accessibile solo quando un server ha esito negativo e l'utente viene reindirizzato a un nuovo server. Il nuovo server rileva una sessione attiva, ma non la trova in memoria, quindi tenta di recuperarla dal database di sessione nel tentativo di fornire all'utente un'esperienza senza soluzione di continuità.

Ci sono due problemi con questo approccio:

Innanzitutto, scaricare i dati della sessione nel database della sessione è un processo lento. I dati della sessione di lavaggio troppo spesso riducono le prestazioni e la maggior parte dei server è configurata per il flush ogni 30 secondi, ogni minuto o più. Questa soluzione di failover "apparentemente" non è mai efficace al 100%.

In secondo luogo, la mia esperienza è che la maggior parte dei clienti concorda sul fatto di aver lanciato un messaggio di errore che chiede all'utente di accedere e riprovare durante le rare situazioni in cui un server non funziona. In questo caso, disattiviamo del tutto il database di sessione e ci godiamo il miglioramento delle prestazioni.

Un altro uso della serializzazione è di fornire tempi di risposta più rapidi utilizzando framework come Flex che utilizzano la serializzazione e la compressione di grafici di oggetti per le interazioni server-client.

Come altri hanno sottolineato, ci sono alcuni motivi creativi e utili per utilizzare la serializzazione, ma questi sono rari nella pratica.

Storicamente la serializzazione è difficile da implementare correttamente e affidabilità, limitando il suo utilizzo a un numero limitato di casi. La maggior parte degli sviluppatori non serializzerà mai gli oggetti stessi, ma potrebbe fare affidamento su framework che lo fanno dietro le quinte.

    
risposta data 21.03.2013 - 07:26
fonte
0

Risposta breve a "quando utilizzare la serializzazione Java" e "quando evitare la serializzazione Java"

Utilizza la serializzazione Java se

  • alcune codifiche dovrebbero essere necessarie
  • non importa che i dati binari non siano leggibili dall'uomo
  • la ricerca nei dati serializzati non è necessaria (la query simile a un database non è possibile)
  • o
    • la struttura dei dati serializzata non cambia o
    • non importa se i dati serializzati memorizzati non sono più leggibili dopo "modifica della struttura dei dati" più (ad esempio i dati di sessione in un'app Web)

In tutte le altre situazioni "Serializzazione Java binaria" è pessima

Alternative

  • serializzazione xml
  • database nosql
  • database relazionale con ORM
risposta data 02.09.2015 - 14:45
fonte

Leggi altre domande sui tag