2010-03-16 10 views
9

Mi sono reso conto oggi che ho seguito ciecamente questo requisito per anni senza mai chiedere davvero perché. Oggi ho trovato una NotSerializableException con un oggetto modello che ho creato da zero e ho capito che basta.Perché gli oggetti di trasferimento devono implementare Serializable?

Mi è stato detto che ciò era dovuto alla replica della sessione tra server con bilanciamento del carico, ma so che ho visto altri oggetti nello scope della sessione che non implementano Serializable. È questa la vera ragione?

risposta

4

E 'la vera ragione. Se in pratica dipenderà in pratica, dipende interamente dal fatto che il server web o il server delle applicazioni di fatto serializzino l'oggetto (o convalidino che è serializzabile, ma realisticamente l'unico modo per farlo è serializzarlo effettivamente).

La maggior parte dei server di applicazioni ha l'opzione (almeno) di non essere severi. Se non si utilizzano server con bilanciamento del carico che effettivamente condividono lo stato, è possibile che lo si sia visto senza problemi.

+0

Grazie. Ha senso. Quindi, qualsiasi oggetto con ambito di sessione che non implementava Serializable non manteneva lo stesso stato o funzionava su server con bilanciamento del carico che non condividevano lo stato? – sma

+0

Un oggetto non riuscirà a serializzare a prescindere da qualsiasi stato manterrà, a patto che non implementa Serializable, quindi se capisco correttamente la tua domanda, la risposta è che tutti gli oggetti inseriti nella sessione che non implementavano Serializable erano in fatto non serializzato dal contenitore, quindi non hai visto un problema. – Yishai

10

Perché per essere trasferiti su un filo devono essere serializzabili su un modulo che può essere messo sul filo.

come binario o XML, JSON, o simillar

C'è di più informazioni qui ... Should any domain object, not be serializable?

+0

Non penso che sia necessario implementare Serializeble per fare in modo che XML o JSON rimuovano unmarshalling su un filo. Ne hai bisogno per i formati binari, ad esempio in RMI. Ma penso che il motivo principale sia perché questi DTO fanno parte di una sessione HTTP e quindi DEVONO essere serializzabili in base alle specifiche del servlet. – HDave

1

Penso che il concetto sia simile a quello che viene chiesto, perché il cibo solido deve essere masticato prima di essere deglutito per la digestione. Ma ovviamente, la differenza è che il bene digerito non può essere in alcun modo deserializzato.

Ricordo di aver usato Sun RPC (attualmente chiamato ONC RPC) che esegue la codifica XDR perché le piattaforme/sistemi informatici rappresentano i loro dati nelle rispettive forme. Ad esempio, big endian vs small endian.

Ma la JVM, indipendentemente dalla macchina, è big-endian, quindi l'endianità non dovrebbe essere un motivo.

La struttura dei dati nella memoria del computer ha puntatori e tutti gli elementi di un oggetto potrebbero non essere collocati su un blocco di memoria contiguo. Tuttavia, quando si passa un oggetto tramite i/o ad un altro sistema, non è possibile passare la distribuzione della memoria di quell'oggetto.

Un oggetto deve essere serializzato prima di essere archiviato in un database perché non si desidera e non si desidera riprodurre la disposizione di modifica dinamica della memoria di sistema.

Il nostro livello di rappresentazione dei dati sulle reti sono tutti basati su flusso di bit. Pertanto, quando si desidera trasferire dati da un sistema a un altro, è necessario convertire i dati dimensionali rappresentati in memoria in uno che può essere trasmesso attraverso le reti byte per byte. In realtà, a poco a poco, e che spesso passa attraverso la compressione e la crittografia di sicurezza. Le routine di compressione e crittografia sono oo-struttura-cieche e si presumono flussi di bit. Gli switch di rete sono oo-struttura-ciechi. La trasmissione di rete non vede nemmeno i bit. I bit sono codificati in un segnale di trasmissione che è spesso sinusoide analogica e quindi modulato. Questi processi non funzionano su schemi multidimensionali/gerarchici di dati strutturati oo.

Immagino che sia possibile eseguire l'offuscamento e la crittografia a livello di oggetto, tuttavia è ancora necessario consentire al sistema di convertirli in flussi di bit, convertendoli prima in flussi di caratteri.

Il marshalling è quando il pastore ha un gregge di pecore e le fa attraversare un ponte di pecore singole su acque agitate.Pertanto, un marshaller deve marcare i nostri oggetti in schemi seriali con riferimenti scritti, in modo che quando lo stormo di informazioni pecore emerga dall'altra parte del ponte, siamo in grado di riassemblarli nuovamente nei suoi schemi gerarchici dal coniugato-demarshaller . Nel nostro caso, la nostra pecora non è guidata da un ponte, ma da avvolgimenti stretti e precari e frane in cui le apparecchiature di trasmissione di rete ad ogni turno memorizzano una copia delle pecore marshalled per garantire che siano in grado di inviare nuovamente la copia in caso le pecore sono cadute in un burrone.

+1

* il bene digerito non può essere in alcun modo deserializzato * Dipende dal cibo inizialmente. Il mio cane può farlo> :) –

+1

Anche il mio cane mangia cibo serializzato. ugghh. Una teoria esiste perché un cane a volte mangia cibo serializzato. Il ragionamento è che i loro tratti intestinali sono brevi in ​​modo che quando un cane mangia il proprio cibo serializzato sta allungando i suoi tratti digestivi due volte. E quando mangia cibo serializzato da un altro mammifero come un cavallo, sta prendendo in prestito il sistema digestivo del cavallo perché non è in grado di trattare la fibra dell'erba con la stessa efficacia di un cavallo o di una mucca. –

Problemi correlati